类的生存周期和初始化列表

本文深入探讨了C++中对象的生存周期,包括对象、临时对象和static定义变量的生命周期,以及初始化列表的使用。文章详细分析了引用如何影响对象的生命周期,并解释了临时对象在不同情况下的生存周期变化,同时介绍了static成员变量和成员方法的特点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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指针

                     

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值