首页 > 编程语言 >C++类和对象(上)

C++类和对象(上)

时间:2024-08-10 13:26:39浏览次数:13  
标签:定义 对象 成员 类域 C++ int Init Stack

文章目录

一、类的定义

1、类的定义格式
  • calss是定义类的关键词,用法更C语言中的结构体struct关键词用法一样,区别是类可以在里面创建函数,当然在C++中也是兼容结构体的,同样也对结构体进行升级也可以包含函数了。
  • 在类里面的函数默认是被内联函数inline修饰的。
  • C++中的类和结构体的用法相同,区别在于默认的限制访问。
  • 类体中内容称为类的成员:类中的变量称为类的属性或成员变量; 类中的函数称为类的⽅法或者成员函数。
  • 为了区分成员变量,⼀般习惯上成员变量会加⼀个特殊标识,如成员变量前⾯或者后⾯加_ 或者 m开头,注意C++中这个并不是强制的,只是⼀些惯例。

#include <iostream>
using namespace std;

class Stack
{
public:

	void Init(int n = 4)
	{
		arr = (int*)malloc(sizeof(int) * n);
		capacity = n;
		top = 0;
	}
private:
	int* arr;
	int capacity;
	int top;
};

int main()
{
	Stack s;
	s.Init();
	return 0;
}
2、访问限定符
  • C++⼀种实现封装的⽅式,⽤类将对象的属性与⽅法结合在⼀块,让对象更加完善,通过访问权限选择性的将其接⼝提供给外部的⽤⼾使⽤。
  • public:修饰的成员在类外可以直接访问。
  • privateprotected:修饰的成员不能直接被访问。
  • class定义的成员没有被限定符修饰的默认为private,而struct默认为**public。
3、类域
  • 类定义了⼀个新的作⽤域,类的所有成员都在类的作⽤域中,在类体外定义成员时,需要使⽤ :: 作⽤域操作符指明成员属于哪个类域。
  • 类域影响的是编译的查找规则,下⾯程序中Init如果不指定类域Stack,那么编译器就把Init当成全局函数,那么编译时,找不到array等成员的声明/定义在哪⾥,就会报错。指定类域Stack,就是知道Init是成员函数,当前域找不到的array等成员,就会到类域中去查找。
#include <iostream>
using namespace std;

class Stack
{
public:
	void Init(int n = 4);
private:
	int* arr;
	int capacity;
	int top;
};

//当声明和定义分离时需要指定类域
void Stack::Init(int n)//缺省参数在申明时添加定义不用添加
{
	arr = (int*)malloc(sizeof(int) * n);
	capacity = n;
	top = 0;

}

int main()
{
	Stack s;
	s.Init();
	return 0;
}

二、实例化

1、实例化概念
  • ⽤类类型在物理内存中创建对象的过程,称为类实例化出对象。
  • 类是对象进⾏⼀种抽象描述,是⼀个模型⼀样的东西,限定了类有哪些成员变量,这些成员变量只是声明,没有分配空间,⽤类实例化出对象时,才会分配空间。
  • ⼀个类可以实例化出多个对象,实例化出的对象 占⽤实际的物理空间,存储类成员变量。
#include <iostream>
using namespace std;

class Stack
{
public:
	void Init(int n = 4);
private:
	int* arr;
	int capacity;
	int top;
};

//当声明和定义分离时需要指定类域
void Stack::Init(int n)//缺省参数在申明时添加定义不用添加
{
	arr = (int*)malloc(sizeof(int) * n);
	capacity = n;
	top = 0;

}

int main()
{
	//实例化
	Stack s1;
	Stack s2;
	return 0;
2、对象的大小
  • 对象的大小是由类中包含的成员决定,而占用大小跟变量成员有关,函数成员是一个函数指针,一个地址,在编译时把保存地址,调用函数时是直接在汇编指令里[call地址]。
  • 计算大小跟结构体的内存对齐一样,用空间换时间。

在这里插入图片描述
内存对齐规则

  • 第⼀个成员在与结构体偏移量为0的地址处。
  • 其他成员变量要对⻬到某个数字(对⻬数)的整数倍的地址处。
  • 注意:对⻬数 = 编译器默认的⼀个对⻬数 与 该成员⼤⼩的较⼩值。
  • VS中默认的对⻬数为8
  • 结构体总⼤⼩为:最⼤对⻬数(所有变量类型最⼤者与默认对⻬参数取最⼩)的整数倍。
  • 如果嵌套了结构体的情况,嵌套的结构体对⻬到⾃⼰的最⼤对⻬数的整数倍处,结构体的整体⼤⼩就是所有最⼤对⻬数(含嵌套结构体的对⻬数)的整数倍。
#include <iostream>
using namespace std;

class ut
{
public:
	double d;
	char e[5];
};

class st
{
public:
	int a;
	ut b;

};

int main()
{

	cout << sizeof(st) << endl;
	return 0;
}

三、this指针

  • this指针是编译器隐形加入的指针变量,用来确定所访问的类,防止混乱,因为类可以创建多个对象,每个对象都有自己的成员,存储信息不同,在调用成员函数时又会调用同一个地方的函数,就会隐形加入一个确定自己对象的this指针

在这里插入图片描述

标签:定义,对象,成员,类域,C++,int,Init,Stack
From: https://blog.csdn.net/2401_83305953/article/details/140965661

相关文章

  • C++day05
    1>思维导图2>搭建一个货币的场景,创建一个名为RMB的类,该类具有整型私有成员变量yuan(元)、jiao(角)和fen(分),并且具有以下功能:(1)重载算术运算符+和-,使得可以对两个RMB对象进行加法和减法运算,并返回一个新的RMB对象作为结果。(2)重载关系运算符>,判断一个RMB对象是......
  • C++day04
    1】思维导图2】完成关系运算符重载,实现成员函数和全局函数的版本。#include<iostream>usingnamespacestd;classStu{friendbooloperator<(constStu&L,constStu&R);private:intage;intid;public:Stu(){}Stu(intage,intid):age(age)......
  • C++day03
    1>思维导图2>设计一个Per类,类中包含私有成员:姓名、年龄、指针成员身高、体重,再设计一个Stu类,类中包含私有成员:成绩、Per类对象p1,设计这两个类的构造函数、析构函数和拷贝构造函数。#include<iostream>usingnamespacestd;classPer{private:stringname;......
  • C++ int32, int64 和十六进制字符串的转换
       #include<iostream>#include<string>#include<cstring>//用于memset,strlen#include<algorithm>/***@brife:将一个int64数字转为十六进制字符串*@note:int64Value:0,hexStr:0000000000000000int64Value:-1,h......
  • C++ 11 auto(自动类型推导) 和 decltype(获取表达式类型)
    C++(2)auto占位符自动类型推导auto能够实现类型的自我推导,并不代表一个实际的类型声明。auto只是一个类型声明的占位符。auto声明的变量,必须马上初始化,以让编译器推断出它的实际类型,并在编译时将auto占位符替换为真正的类型。注意:C++11中auto不能用于函......
  • Java网络编程——Request Response 对象
    Response-网页上一章我们学习了Java中使用Okhttp3库请求网页或调用API的知识。使用一条语句执行调用请求,并取得返回结果字符串:call.execute().body().string()execute()方法是真正执行发送请求,前面的一系列代码是做前置准备。这段代码获得服务器返回内容的......
  • 编写类 MyTools 类,编写一个方法可以打印二维数组的数据。 2) 编写一个方法 copyPerson
    1publicclassMethodExercise02{2publicstaticvoidmain(String[]args){34Personp=newPerson();5p.name="milan";6p.age=100;7//创建tools8MyToolstools=newMyTools();9......
  • 【C++】decltype
    1、简介我们之前使用的typeid运算符来查询一个变量的类型,这种类型查询在运行时进行。RTTI机制为每一个类型产生一个type_info类型的数据,而typeid查询返回的变量相应type_info数据,通过name成员函数返回类型的名称。同时在C++11中typeid还提供了hash_code这个成员函数,用于返回类型......
  • C++入门基础知识(笔记):成员变量和成员函数分开存储,非静态成员变量,是属于类的对象上,空对
    在C++中,类内的成员变量和成员函数分开存储只有非静态成员变量才属于类的对象上。1.空对象占用内存空间为:1个字节,代码演示:#include<iostream>usingnamespacestd;//成员变量和成员函数分开存储classPerson{};//这是一个空对象voidtest01(){ Personp;......
  • 2024年华为OD机试真题-求幸存数之和-(C++/Java/python)-OD统一考试(C卷D卷)
    2024华为OD机试真题目录-(B卷C卷D卷)-【C++JavaPython】_华为od机试csdn-CSDN博客 题目描述给一个正整数数列nums,一个跳数jump,及幸存数量left。运算过程为:从索引0的位置开始向后跳,中间跳过J个数字,命中索引为J+1的数字,该数被敲出,并从该点起跳,以此类推,直到幸存le......