C++中的对象组合
C++中的类可以使用其它类定义的成员变量,那么如何给对象成员进行初始化呢?
如一下组合示例:
点击(此处)折叠或打开
-
#include <stdio.h>
-
#include <stdlib.h>
-
class M
-
{
-
private:
-
int mI;
-
public:
-
M(int i)
-
{
-
printf(" M(int i), i = %d\n",i);
-
mI = i;
-
}
-
int getmI()
-
{
-
return mI;
-
}
-
};
-
class Test
-
{
-
private:
-
const int c;
-
M m1;
-
M m2;
-
public:
-
Test()
-
{
-
printf("Test()\n");
-
}
-
};
-
int main()
-
{
-
Test t1;
-
Test t2 = Test();
-
printf("Press any key to continue...");
-
getchar();
-
return 0;
- }
上面代码示例不能编译通过,是因为在Test类中的成员变量中有M类对象没有初始化。为此我们可以使用初始化列表对成员变量进行初始化,其语法规则为:
Constructor::Contructor():m1(v1), m2(v2),m3(v3)
{
//some other assignment operation
}
注意:成员变量初始化顺序与声明的顺序相关,与在初始化列表中的顺序无关;初始化列表先于构造函数的函数体执行的。
小插曲
类中的const成员是肯定会被分配空间的;类中的congst成员变量只是一个只读变量;编译器无法直接得到const成员变量的初始化值,一次无法进入符号表称为真正意义上的常量。
初始化与赋值不同
初始化是用已存在的对象或值对正在创建的对象进行初值设置;
赋值是用已存在的对象或值对已经存在的对象进行值设置;
区别:
初始化:被初始化的对象正在创建
赋值:被赋值的对象已存在。
析构函数-----对象的销毁
如何清理被销毁的对象?
一般而言所有被销毁的对象都需要做清理
解决方案
为每个类都提供一个public的destroy函数,对象不再被需要时立即调用destroy函数进行清理。
但是destroy函数只是一个普通的函数必须显示的调用,如果对象销毁前没有做清理,那么很可能造成资源泄露,在构造函数中申请的资源,需要在对象销毁前释放,这样C++编译器能够自动调用某个特殊函数进行对象的清理。
它就是析构函数。
C++中的类可以定义一个特殊的成员函数清理对象,这个特殊的函数叫做析构函数。
定义:~ClassName()
析构函数没有参数也没有任何返回类型的声明,析构函数在对象销毁时自动被调用。
点击(此处)折叠或打开
-
#include <stdio.h>
-
#include <stdlib.h>
-
class Test
-
{
-
public:
-
Test()
-
{
-
printf("Test()\n");
-
}
-
~Test()
-
{
-
printf("~Test()\n");
-
}
-
};
-
void func()
-
{
-
Test t1;
-
Test t2;
-
}
-
int main()
-
{
-
func();
-
printf("Press any key to continue...");
-
getchar();
-
return 0;
- }
构造函数与析构函数的调用秩序
当类中的成员变量是其它类的对象时,首先调用成员变量的构造函数,调用顺序与声明顺序相同,之后调用自身的构造函数;析构函数的调用秩序与对应的构造函数调用秩序相反。
点击(此处)折叠或打开
-
#include <stdio.h>
-
#include <stdlib.h>
-
class Test
-
{
-
private:
-
int mI;
-
public:
-
Test()
-
{
-
printf("Test()\n");
-
mI = -1;
-
}
-
Test(int i)
-
{
-
printf("Test(int i), i = %d\n", i);
-
mI = i;
-
}
-
Test(const Test& obj)
-
{
-
printf("Test(const Test& obj),i = %d\n",obj.mI);
-
mI = obj.mI;
-
}
-
~Test()
-
{
-
printf("~Test(), i = %d\n", mI);
-
}
-
};
-
void func(Test t)
-
{
-
Test r(1);
-
}
-
void run()
-
{
-
Test t;
-
func(t) ;
-
}
-
-
int main()
-
{
-
run();
-
printf("Press any key to continue...");
-
getchar();
-
return 0;
- }
小结:
析构函数是C++中对象销毁时做清理工作的特殊函数,析构函数在对象销毁时自动被调用;析构函数是对象所使用的资源及时释放的保障;析构函数的调用秩序与构造函数相反。