特殊的成员函数,名字与类名相同,无返回值,创建类对象时自动调用,对象生命周期内只能调用一次。保证每个数据成员都有一个合适的初试值。可以重载
如果未写构造函数,则编译器会自动添加一个无参的构造函数。
创建对象时,给构造函数传递参数:
Student::Student(const string &name = "",int age = 0, int score = 0){
}
Student other("xiaoming",10,100);//对象给构造函数传参,适用于函数重载,若不带参数,则会寻找无参的构造函数。
不能用const修饰,不能是虚函数。
:name(name),左边的是成员变量名,右边的是参数名
继承理论上是不继承构造函数的,想要使用基类的构造函数,就得在初始化列表调用。
Student *pstu = new Student(“abc”,20,100);
c_str()是string类的成员函数,返回字符串的首地址。
构造函数调用顺序相反
特殊成员函数,名字和类名相似 ~类命,没有返回值没有参数,对象销毁的时候自动调用。只能调用一次,保证每个对象的资源都能释放掉,一个类只有一个析构函数,无重载。
如果需要所有的对象共享一个变量,那么这个类的成员变量应该使用static修饰。
定义时用static
必须在类外初始化
int Test::b = 10;
可以通过类名直接访问
不可以跨文件使用,全局变量可以跨文件使用
一切不需要创建对象就可以有确定行为的函数都应该设计成静态的。比如说排序的算法,可以直接使用,不需要对象。
静态成员函数直接是类调用,所以没有this指针,而非静态成员函数是对象创建才调用,所以存在this指针。
静态的属于类,只要类存在静态就存在,静态可以通过类直接调用
非静态属于对象,必须在有对象的时候,才可以调用非静态的
静态的是所有对象共享的,非静态每个对象相互之间独立
静态部分只能直接访问静态部分,非静态部分可以访问所有部分
父类和子类有同名成员函数时,用父类指针指向子类对象,调用的是父类的成员函数,若父类函数为虚函数,则调用子类成员函数
但是构成多态还有两个条件:
用const修饰,只能在构造函数的参数列表中初始化
用const修饰,常成员函数和非常成员函数是重载模式。常成员函数不能修改成员变量的值。但可以访问。
void showStudent() const;//声明
void showStudent() const{
}//实现
**一个对象被const修饰,他就不能调用非常成员函数,只能调用常成员函数。**因为编译器不知道成员函数是否有修改变量的情况,所以只判断成员函数是否有修改变量的权限(是否有const修饰)。