1. 结构体
1.C语言中,如果不使用typedef给结构体起别名,那么定义结构体变量的时候,必须使用 struct 结构体名 结构体变量名;而 C++ 中允许直接使用: 结构体名 结构体变量名; 来定义变量
2.C语言中,结构体中不允许封装函数,只能封装函数指针,而C++的结构体中允许定义函数。
2. 类
2.1 声明一个类
class 类名{ private: //后面是冒号,私有的成员变量(数据/属性)和成员函数(方法/行为)
protected: //受保护的成员变量(数据/属性)和成员函数(方法/行为)
public: //共有的成员变量(数据/属性)和成员函数(方法/行为) };别忘了写分号
2.2 封装
面向对象的三大特征(封装、继承、多态),如果有四,加一个抽象,我们对类的定义,就属于封装的范畴。
封装:将和一类事物相关的完事万物都封装成类,通过类对象去做事儿。
访问控制权限:
public: 修饰的成员 在类内、子类中、类外都可以直接访问;
protected: 修饰的成员 在类内和子类中可以访问 类外不能直接访问;
private: 修饰的成员 只能在类内访问 子类中和类外都不能直接访问。
类的成员函数中是可以访问类的成员变量的(public protected private 都可以访问),即使是通过函数传参传递过来的本类的对象的私有成员,也能访问。也就是说,访问控制是针对整个类而言的,并不是针对某个类对象(例如,s1,s2都可以通过函数访问类里的private)而言的。访问控制一旦出现,后面所有的成员都受该权限的控制,直到出现新的访问控制权限,或者类的定义结束,访问控制权限允许多处出现和使用,但是一般情况下,能都通过对成员的归类,一般一种权限只写一次。如果类中没有写访问控制权限,默认的所有成员都是被private控制的。
类外定义的时候,要加上类名以及作用域区间符::。
class Cuboid{
private:
int length;//长
int weight;//宽
int high;//高
int V;//体积
public:
#if 0
//类内定义的写法
Cuboid(int l, int w, int h){
cout<<"构造函数"<<endl;
length = l;
weight = w;
high = h;
}
#endif
//类内声明
Cuboid(int l, int w, int h);
};
//类外定义的写法
Cuboid::Cuboid(int l, int w, int h){
cout<<"构造函数"<<endl;
length = l; weight = w; high = h;
}
3. C++中类和结构体的区别
唯一的区别,就是默认的访问控制权限不同:
类中成员的默认的访问权限:private;
结构体中成员的默认的访问权限:public。
4. this指针
this指针是类中成员函数的一个隐藏的形参,哪个类对象来调用成员函数,this指针就指向谁。
this指针的类型: 类型 * const this;
this是C++中的一个关键字,也是一个const指针,它指向当前对象,通过它可以访问当前对象的所有成员;
(1)this可以访问类的所有成员,包括private、protected、public;
(2)this是const指针,它的值不能被修改的。
(3)this只能在成员函数内部使用,不能在其他地方使用。
(4)只有当对象被创建后this才有意义,因此不能在static成员函数中使用。
(6)友元函数没有this,要访问非static成员时,需要对象做参数;要访问static成员或全局变量时,则不需要对象做参数;
注意:
1.不能在成员函数的形参中使用this指针;
2.不能在构造函数的初始化表中使用this指针;
3.在成员函数的函数体中可以使用this指针。
一种必须使用this指针的场景:
成员函数的形参和成员变量重名时(也可以使用 构造函数 的初始化表解决):
class Test{
private:
int a;
int b;
public: void init(int a, int b){ //成员函数的形参和成员变量重名时 //在成员函数内部 不加修饰 默认使用的是形参 //a = a;//形参自己给自己赋值 //b = b;//形参自己给自己赋值 //这是可以使用this指针区分
this->a = a;
this->b = b;
cout<<"init: "<<a<<" "<<b<<endl;//10 20
} void show(){
cout<<"show: "<<a<<" "<<b<<endl;//10 20 }
};
另一种必须使用this指针的场景:
拷贝赋值函数需要返回自身的引用时,只能通过this指针访问。