C++类和对象上
一·类的定义
(1)
class为定义类的关键字,后接类名,{}中是类的主体,{}后的;不能省略(与C语言的结构体类似),类体中内容称为类的成员:类中的变量称为类的属性或成员变量,类中的函数称为类的⽅法或者成员函数
class stack
{
int size;
int capacity;
int Print()
{
std::cout<< "hello"<<std::endl;
}
};
(2)
为了区分成员函数,通常我们在成员变量前做标识,加_或加m,注意不是强制规定,只是建议,做一个区分,增加代码的可读性
class DATA
{
private:
int _year;//这里是成员变量
int _mounth;
int _day;
};
int main()
{
DATA T;
return 0;
}
(3)
C++中把struct也升级成了类,但我们一般还是用class来定义类
注意:
类里面的函数默认为内联函数
二· 访问限定符
• C++⼀种实现封装的⽅式,⽤类将对象的属性与⽅法结合在⼀块,让对象更加完善,通过访问权限
选择性的将其接⼝提供给外部的⽤户使⽤。
• public修饰的成员在类外可以直接被访问;protected和private修饰的成员在类外不能直接被访问。
• 访问权限作⽤域从该访问限定符出现的位置开始直到下⼀个访问限定符出现时为⽌,如果后⾯没有
访问限定符,作⽤域就到}即类结束。
• class定义成员没有被访问限定符修饰时默认为private,struct默认为public。
• ⼀般成员变量都会被限制为private/protected,需要给别⼈使⽤的成员函数会放为public。
类域
当在类域外面定义函数时需要用域限定符::来指定空间域
class Stack
{
public:
void Init();
private:
int _a;
};
void Stack::Init()
{
_a = 4;
}
int main()
{
Stack T;
T.Init();
return 0;
}
类域影响的是编译的查找规则,上面程序中Init如果不指定类域Stack,那么编译器就把Init当成全局函数,那么编译时,找不到array等成员的声明/定义在哪⾥,就会报错。指定类域Stack,就是知道Init是成员函数,当前域找不到的array等成员,就会到类域中去查找。
实例化
• ⽤类类型在物理内存中创建对象的过程,称为类实例化出对象。
• 类是对象进⾏⼀种抽象描述,是⼀个模型⼀样的东西,限定了类有哪些成员变量,这些成员变量只是声明,没有分配空间,⽤类实例化出对象时,才会分配空间。
• ⼀个类可以实例化出多个对象,实例化出的对象占⽤实际的物理空间,存储类成员变量。打个比方:类实例化出对象就像现实中使⽤建筑设计图建造出房⼦,类就像是设计图,设计图规划了有多少个房间,房间⼤⼩功能等,但是并没有实体的建筑存在,也不能住⼈,⽤设计图修建出房⼦,房子才能住⼈。同样类就像设计图⼀样,不能存储数据,实例化出的对象分配物理内存存储数据。
class Stack
{
public:
void Init()
{
_a = 10;
}
private:
int _a;//这里只是声明,并没有分配空间
};
int main()
{
Stack T;//这里才创建了空间
T.Init();
return 0;
}
对象的大小
类对象的大小计算与结构体相似,但是成员函数不计入大小的计算
对齐规则:
第⼀个成员在与结构体偏移量为0的地址处。
• 其他成员变量要对⻬到某个数字(对⻬数)的整数倍的地址处。
• 注意:对⻬数=编译器默认的⼀个对⻬数与该成员⼤⼩的较⼩值。
• VS中默认的对⻬数为8
• 结构体总⼤⼩为:最⼤对⻬数(所有变量类型最⼤者与默认对⻬参数取最⼩)的整数倍。
• 如果嵌套了结构体的情况,嵌套的结构体对⻬到⾃⼰的最⼤对⻬数的整数倍处,结构体的整体⼤⼩
就是所有最⼤对⻬数(含嵌套结构体的对⻬数)的整数倍。
this指针
当我们调用T.Init时,我们没有调用它的地址,他是如何将我们的T对象初始化的呢?
实际上C++给了我们一个隐含的this指针,Init()函数的真实原型是这样的Init(Stack *const this)
类的成员函数中访问成员变量,本质都是通过this指针访问的,如Init()中_a的赋值实际上是这样的,this->_a = 10;则上述代码可以写成这个形式
class Stack
{
public:
void Init()
{
this->_a = 10;
}
private:
int _a;//这里只是声明,并没有分配空间
};
int main()
{
Stack T;//这里才创建了空间
T.Init();
return 0;
}
注意:C++规定不能在实参和形参的位置显⽰的写this指针(编译时编译器会处理),但是可以在函数体内显示使⽤this指针