第二章 C++ 类与对象
前言
在C语言中结构体只能定义变量,在C++中,结构体内不仅可以定义变量,也可以定义函数。
类的定义
语法形式
struct/class 类名:{
访问控制限定符:
类名(形参表):初始化表{...}//构造函数
~类名(void){...} //析构函数
返回类型 函数名(形参表){} //成员函数
数据类型 变量名;//成员变量
};
访问限定符
- public:公有成员,在任何位置都可以访问。
- private:私有成员,只有类的内部才能访问。
- protected:保护成员。
public修饰的成员在类外可以直接被访问
protected和private修饰的成员在类外不能直接被访问(此处protected和private是类似的)
访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止
如果后面没有访问限定符,作用域就到 } 即类结束。
C++中struct和class的区别是什么?
答:C++需要兼容C语言,所以C++中struct可以当成结构体使用。另外C++中struct还可以用来定义类。和class定义类是一样的,区别是struct定义的类默认访问权限是public,class定义的类默认访问权限是private。注意:在继承和模板参数列表位置,struct和class也有区别,后序给大家介绍。
类的作用域
类定义了一个新的作用域,类的所有成员都在类的作用域中。在类体外定义成员时,需要使用 ::(两个冒号)作用域操作符指明成员属于哪个类域。
类的实例化
用类创建对象的过程,称为类的实例化
在栈中创建对象
// 单个对象
类名 对象(构造实参表);
类名 对象 = 类名(构造实参表);
// 多个对象(对象数组)
类名 对象数组[元素个数] = {
类名(构造实参表),类名(构造实参表),类名(已有的对象),...};
在堆区创建/销毁对象
// 单个对象
创建:类名* 对象指针 = new 类名(构造实参表);
销毁:delete 对象指针;
// 多个对象(对象数组)
// 创建:
类名* 对象指针 = new 类型[元素个数]{
类名(构造实参表),类名(构造实参表),类名(已有的对象),...};
// 销毁:
delete[] 对象指针;
计算类对象的大小
一个类的大小,实际就是该类中”成员变量”之和,当然要注意内存对齐。
注意空类的大小,空类比较特殊,编译器给了空类一个字节来唯一标识这个类的对象。(只有函数的类,其函数也是在公共代码区去定义的,因此不占用类的内存,因此也可看成一个空类)
this指针
C++编译器给每个“非静态的成员函数“增加了一个隐藏的指针参数,让该指针指向当前对象(函数运行时调用该函数的对象),在函数体中所有“成员变量”的操作,都是通过该指针去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成。
this指针本质上是“成员函数的“的形参,当对象调用成员函数时,将对象地址作为实参传递给this形参。所以对象中不存储this指针。在函数中有this。
this指针一般是存放在栈帧中
this 等于对象的地址, *this 等于 对象
this指针为空,只要调用的函数去访问对象的数据会引起 空指针的解引用(运行错误) 异常,程序崩溃。