对象数组和对象指针
类实际是一种自定义数据类型,可以用它来定义各种不同的对象。对象数组就是用类定义的数组,它的每个元素都是对象。
也可以定义对象的指针,用指针指向类对象。对象指针与结构指针的访问方法相同,即用: ->成员变量或成员函数 (*指针).成员变量或成员函数 两种操作符访问其所指对象的成员。
说明:
1)、要定义对象数组的类必须有不需要参数的构造函数,包括以下几种情况:
2)、没有定义任何构造函数的类可以定义对象数组,因为C++会为这种类产生一个默认构造函数。
3)、如果一个类同时具有无参构造函数和全部参数都有缺省值的构造函数,也可以定义对象数组。无参构造函数在定义对象数组时拥有优先权。但在定义无参对象时,将产生二义性
4)、如果一个类只有需要参数的构造函数(不包括全部参数都有默认值的情况),就不能定义其对象数组。
//this,当前对象的指针
//函数是共享的,必须要有能够标识当前对象是谁的办法
class Student
{
public:
void mprintf(){
cout << "name:" << name << "--------" << "age:" << age << endl;
}
//常函数,修饰的是this
//既不能改变指针的值,又不能改变指针指向的内容
//const Student* const this
void myprint() const{
printf("%#x\n", this);
//改变属性的值
//this->name = "xiaofang";
//改变this指针的值
//this = (Student*)0x00009;
cout << this->name << "," << this->age << endl;
}
//覆盖该类的默认构造函数
Student(char*name, int age){
this->name = name;
this->age = age;
cout << "构造函数" << endl;
}
//析构函数
~Student(){
cout << "析构函数" << endl;
}
void setName(char* name){
this->name = name;
}
char* getName(){
return this->name;
}
private:
char* name;
int age;
};
void func(){
Student s("xiaoMing", 15);
const Student s2("xiaoFang", 18);
//s2.mprintf(); //常量对象只能调用常量函数,不能调用非常量函数
//常函数,当前对象不能被修改,防止数据成员被非法访问
s.mprintf();
s.myprint(); //非常量对象既可以调用常量函数,也可以调用非常量函数
}
对象的生存期
对象的生存期:指对象从它被创建开始到被销毁之间的时间。包括静态生存期和动态生存期两种类型。
静态生存期:是指对象具有与程序运行期相同的生存期,这类对象一旦被建立后,它将一直存在,直到程序运行结束时才被销毁。
动态生存期:指局部对象的生存期,局部对象具有块作用域,它的生存期是从它的定义位置开始,遇到离它最近的“}”就结束了。
全局对象和静态对象具有静态生存期。
各种对象的构造与析构
局部对象:
声明期局限于定义它的语句块
程序执行到其定义处构造
语句块结束时析构
全局对象:
生命期与程序相同
全局对象在调用main()之前构造
全局对象在调用main()之后析构
不同文件定义的全局对象,其构造顺序不定
局部静态对象:
程序第一次执行到其定义代码处构造
调用main()之后析构
局部静态对象仅构造一次
说明:
生存期与对象的构造顺序和销毁顺序密切相关;
局部对象和静态对象的构造顺序与它们在块中的声明顺序相同,即在块中先声明的就先构造,块即对象 定义所在的一对{}所框定的代码区域;
所有的全局对象在main之前构造,在main 结束之后销毁;
对象数据成员(包括对象成员)的构造顺序与其在类中的声明顺序相同,而与它们在构造函数的初始化列表中的顺序无关;
在对象生存期结束时,具有相同生存期的对象将按与构造的相反顺序销毁;
非静态对象的生存期与其作用域是一致的,而静态对象的生存期则长于其作用域,程序结束时静态对象的生存期才结束。