构造函数constructor 与析构函数destructor(四)

(1)构造函数初始化列表:

1 class Test{
2     int i;
3 public:
4     Test(int vi):i(vi){}//这里的从冒号开始,到右大括号结束,这一段是构造函数初始化列表
5
6 };

构造函数的执行分为两个阶段:(1)初始化阶段  (2)普通计算阶段

初始化是我们定义一个变量,分配内存时直接给变量赋值,例如 int i=10;  而int k; k=10;这样的就不是初始化,是赋值。所以在初始化列表里面的初始化才是真正的初始化,即初始化阶段。而在构造函数内的那些是赋值操作,即普通计算阶段。

(1)const 成员变量的初始化,只能在构造函数初始化列表初始化,其实在其定义处也可以直接初始化

1 class Object{
2     const int i;//const成员变量
3 public:
4     Object(int vi):i(vi){}//在初始化列表中对const成员变量初始化
5
6 };

(2)引用成员变量的初始化,也只能在构造函数初始化列表中进行

1 class Object{
2       int N;
3       int& refN;//引用成员变量
4 public:
5      Object():refN(N){}//在构造函数初始化列表处对引用成员变量初始化
6
7
8 };

(3)对象成员的初始化,如果子对象没有默认构造函数,也只能放在外部类的构造函数初始化列表初始化。

 1 class Object{
 2     int m_i;
 3 public:
 4     Object(int vi):m_i(vi){}
 5
 6 };
 7
 8 class Container{
 9     Object obj;
10 public:
11      Container(){}
12 };
13
14
15 int main(){
16
17     Container cn;//这句话会报错误,因为在创建Container对象时,会先创建Object的对象,此时会调用Object的默认构造函数 ,但是我们在Object类里面并没有定义默认构造函数。
18     return 0;
19 }

所以上面的问题有两个解决版本,一是在Object类中添加默认构造函数,二是在Container构造函数初始化列表中,像obj(0)这样初始化obj对象。

如果一个类中包含对象成员,那么再构造时,先构造对象成员,然后再构造外部对象。 并且一个类中包含多个对象成员,这些对象成员的构造顺序是和定义顺序一致的。在析构对象成员时,和定义的顺序相反。

还有就是先析构外部对象,再析构内部子对象。

(4)如果要定义一个对所有对象都是常量的成员,可以采用两种形式 一,是const static int   二,是enum枚举

 1 class Object{
 2     const static int N=10;
 3     enum E_Type{
 4           TYPE_A=100;
 5      };
 6      int a[N];
 7      int b[TYPE_A];
 8 public:
 9
10
11 };
时间: 2024-10-05 05:41:44

构造函数constructor 与析构函数destructor(四)的相关文章

构造函数constructor 与析构函数destructor(一)

构造函数定义:构造函数c++中在创建对象时自动调用,用来初始化对象的特殊函数. (1)构造函数的名字必须与类的名字相同,不能有返回值,哪怕是void 也不行. (2)通常情况下构造函数应声明为公有函数,否则它不能像其他成员函数那样被显式地调用 构造函数被声明为私有有特殊的用途,这个以后再写. (3)但是可以有参数,因为有参数,故可以被重载. 1 #ifndef TEST_H 2 #define TEST_H 3 class Test{ 4 int m_i; 5 public: 6 Test(in

构造函数constructor 与析构函数destructor(二)

(1)转换构造函数 转换构造函数的定义:转换构造函数就是把普通的内置类型转换成类类型的构造函数,这种构造函数只有一个参数.只含有一个参数的构造函数,可以作为两种构造函数,一种是普通构造函数用于初始化对象,一种是转换构造函数 1 //test.h 2 #ifndef TEST_H 3 #define TEST_H 4 class Test{ 5 int m_i; 6 public: 7 Test(int i = 0);//转换构造函数,也是普通构造函数 8 ~Test(); 9 10 }; 11

Python 构造函数、 Python 析构函数、Python 垃圾回收机制

构造函数与析构函数 构造函数: 用于初始化类的内容部状态,Python提供的构造函数式 __init__(); __init__()方法是可选的,如果不提供,Python 会给出默认的__init__方法 一般数据的获取需要定义的get和set方法 析构函数: 用于释放对象占用的资源,Python 提供的析构函数式__del__(); __del__()也是可选的,如果不提供,则Python 会在后台提供默认析构函数 如果要显式的调用析构函数,可以使用del关键字,方式如下: del对象名 垃圾

类String的构造函数(包含一个拷贝构造函数)、析构函数和赋值函数

每个类只有一个析构函数和一个赋值函数,但可以有多个构造函数(包含一个拷贝构造函数,其它的称为普通构造函数). class String { public: String(const char *str = NULL); // 普通构造函数 String(const String &other); // 拷贝构造函数 ~ String(void); // 析构函数 String & operate =(const String &other); // 赋值函数 // 相加函数,如果没

Java 语法 索引 ----- 构造函数(constructor)

重载 class MyRectangle{ int x, y; public MyRectangle() { x = 10; y = 20; } public MyRectangle(int a) { x = a; y = a; } public MyRectangle(int a, int b) { x = a; y = b; } } Constructor chaining public MyRectangle() { this(10,20); } public MyRectangle(in

JavaScript探秘:构造函数 Constructor

除了创建对象,构造函数(constructor) 还做了另一件有用的事情—自动为创建的新对象设置了原型对象(prototype object) .原型对象存放于 ConstructorFunction.prototype 属性中. 例如,我们重写之前例子,使用构造函数创建对象“b”和“c”,那么对象”a”则扮演了“Foo.prototype”这个角色: // 构造函数 function Foo(y) { // 构造函数将会以特定模式创建对象:被创建的对象都会有"y"属性 this.y

C#析构函数(destructor)和终结器(Finalizer) .

使用析构函数释放资源 析构函数用于析构类的实例. 1)         不能在结构中定义析构函数.只能对类使用析构函数. 2)         一个类只能有一个析构函数. 3)         无法继承或重载析构函数. 4)         无法调用析构函数.它们是被自动调用的. 5)         析构函数既没有修饰符,也没有参数. 例如,下面是类 Car 的析构函数的声明: [csharp] view plaincopy class Car { /// <summary> /// 析构函

javascript工厂函数(factory function)vs构造函数(constructor function)

如果你从其他语言转到javascript语言的开发,你会发现有很多让你晕掉的术语,其中工厂函数(factory function)和构造函数(constructor function)就是其中的一个.本文试图理顺这两者之间的区别. Factory functions 工厂函数是将返回一个新的object的任何不是类或者构造函数的函数.在js中,任何函数都能够返回一个object.如果我们不是通过new function()的方式来获得这个对象的,那么她就是一个factory工厂函数. funct

【转】c++析构函数(Destructor)

创建对象时系统会自动调用构造函数进行初始化工作,同样,销毁对象时系统也会自动调用一个函数来进行清理工作,例如释放分配的内存.关闭打开的文件等,这个函数就是析构函数. 析构函数(Destructor)也是一种特殊的成员函数,没有返回值,不需要程序员显式调用(程序员也没法显式调用),而是在销毁对象时自动执行.构造函数的名字和类名相同,而析构函数的名字是在类名前面加一个~符号. 注意:析构函数没有参数,不能被重载,因此一个类只能有一个析构函数.如果用户没有定义,编译器会自动生成一个默认的析构函数. 上