1、对象的生存周期:
如果形参是对象类型 建议使用引用,如果不用,多了对象的生成步骤,多了空间的开辟、构造函数、析构函数的调用,浪费资源。代码见下:第一次会显示3次函数调用,加引用后只有两次:
#include<iostream>
#include<string.h>
using namespace std;
class Object
{
public:
Object(char *name)
{
cout<<"Object:: Object()"<<endl;
mname = new char[strlen(name) + 1];
strcpy(mname,name);
mnum = strlen(mname) + 1;
}
Object(const Object& rhs)
{
cout<<"Object::Object(Object)"<<endl;
mname = new char[strlen(rhs.mname) +1 ];
strcpy(mname,rhs.mname);
mnum = rhs.mnum;
}
Object& operator=(const Object& rhs)
{
cout<<"Object::operator= Object()"<<endl;
if(this != &rhs)
{
delete[] mname;
mname = new char[strlen(rhs.mname)+1];
strcpy(mname,rhs.mname);
}
return *this;
}
~Object()
{
cout<<"Object:: ~Object()"<<endl;
delete[] mname;
mname = NULL;
}
private:
char *mname;
int mnum;
};
void Func(Object& obj)
{
Object tmp(obj);
}
int main()
{
Object ob1("obj1");
Func(ob1);
return 0;
}
2、临时对象的生存周期:
知道碰到‘,’、‘;’、‘?’结束
2.1引用会提升临时对象的生存周期(提升到和引用对象相同)
int main()
{
Object* pobj = &Object("object");
cout<<"----------------"<<endl;
Object& pobj1 = Object("obj1");
cout<<"---------------"<<endl;
}
2.2如果临时对象被用来生成一个新的对象,则改临时对象会被优化掉,总共只生成一个对象(编译器的优化)。
int main()
{
Object obj = Object("obj");
}
2.3、static 定义变量的生成时间:函数运行时开辟内存,而非和全局变量一样,在编译链接阶段开辟,但销毁时间一样,同样是程序结束才销毁。
int main()
{
Object lobj1("local object1");
Object lobj2(10);
static Object sobj("static object");
Object lobj3 = lobj1;
lobj3 = lobj2;
Object* pobj4 = new Object("local object4");
Object aobj5[2];
Object* pobj6 = &Object("local object6");
Object& robj7 = (Object)("local object7",20);
Object& pobj8 = *(new Object("local object8"));
Object obj9 = "object9";
delete pobj4;
Object obj10 = Object("object10");
obj9 = Object("object11");
return 0;
}
3、初始化列表
class CDate
{
public:
CDate(int year ,int month,int day)
{
myear = year;
mmonth = month;
mday = day;
}
private:
int myear;
int mmonth;
int mday;
};
class Student
{
public:
Student(char* name,bool sex,int age,int year,int month,int day):mdate(year,month,day)
{
mname = new char[strlen(name)+1];
strcpy(mname,name);
msex = sex;
msex = sex;
mage = age;
//mdate(yaer,month,day);
}
private:
char* mname;
bool msex;
int mage;
CDate mdate;
static int mid;
};
3.1静态成员变量是对象所共享的,必须在类外初始化,因为一旦在构造函数内初始化就会重复初始化静态变量,会报错。
private:
char* mname;
bool msex;
int mage;
CDate mdate;
static int mid;
};
int Student::mid = 1201212;
3.2static的成员方法的作用:
_cdecl调用方法,不生成this指针,看不到当前对象中的成员,所以只能调用static成员。
解决办法:加this指针,指明要调用的是当前对象的成员(为什么可以用this指针,因为对象不是静态的,开辟对象时就给这个对象生成了一个this指针,指向所有的函数,但需要显示写出this指针。)
(静态的成员方法中调用普通的成员方法)可以拿对象调用static成员方法,也可以直接通过类型作用域调用,不过这种方式只能调用static成员变量,理由如上。
静态的成员方法中调用普通的成员方法:(不行,理由如上)
普通的成员方法中调用静态的成员方法(可以直接用this指针调用)。
普通成员方法:
_thiscall调用约定,自动生成一个this指针
本文深入探讨了C++中对象的生存周期,包括对象、临时对象和static定义变量的生命周期,以及初始化列表的使用。文章详细分析了引用如何影响对象的生命周期,并解释了临时对象在不同情况下的生存周期变化,同时介绍了static成员变量和成员方法的特点。

被折叠的 条评论
为什么被折叠?



