构造函数和初始化列表

区别:

  1. 对于在函数体中(构造函数)初始化,是在所有的数据成员被分配内存空间后才进行的。
  2. 列表初始化是给数据成员分配内存空间时就进行初始化,就是说分配一个数据成员只要冒号后有此数据成员的赋值表达式(此表达式必须是括号赋值表达式),那么分配了内存空间后在进入函数体之前给数据成员赋值,就是说初始化这个数据成员此时函数体还未执行。

  在我们使用初始化列表进行初始化时,它是关于C++初始化类成员的。它们是按照声明的顺序初始化的,而不是按照出现在初始化列表中的顺序。

三种类型必须通过初始化列表来初始化 

  1. 常量
  2. 引用类型
  3. 没有默认构造函数的类类型

  初始化列表和构造函数初始化(赋值)的方式对于内置类型的成员(如int等)来说,其实没有什么区别,其性能和结果往往一样。对于非内置类型的成员(类类型)来说,是有区别的。

  因为编译器总是确保所有成员对象在构造函数体执行之前初始化,所以类类型的数据成员对象,在进入构造函数体之前已经完成构造。例子中编译的代码将调用base::base()来初始化b(这里调用一次base构造函数),这在控制到达赋值语句前完成。接下来有调用一个赋值运算符函数。结果是调用了两个base函数(构造函数和赋值操作符)。

#include <iostream>
using namespace std;

class base
{
    public:
        base()
        {
            cout<<" empty construct"<<endl;
        }
        base(const base &b)
        {
            cout<<" copy construct"<<endl;
        }
        base& operator=(base &b)
        {
            if(&b!=this)
                cout<<" operator = construct"<<endl;
            return *this;
        }
};
class my_base
{
    public:
        my_base(base &b)
        {
            ba=b;
            cout<<" my_base construct"<<endl;
        }
        base ba;
};
int main()
{
    base b;
    my_base    mb(b);
    return 0;
}

  把my_base类改成初始化列表形式

class my_base
{
    public:
        my_base(base &b):ba(b)
        {
            cout<<" my_base construct"<<endl;
        }
        base ba;
};

原文地址:https://www.cnblogs.com/tianzeng/p/10503387.html

时间: 2024-08-08 21:58:38

构造函数和初始化列表的相关文章

C++ 初始化形式、变量初始化规则、类构造函数的初始化列表

类构造函数的初始化列表,举例 一个对象的构造分两部分,首先是分配空间,然后初始化. 只要有对象生成,不管是以什么形式生成,都会调用构造函数进行初始化. 然后下面有个例子,在蓝色区域Big类的复制构造函数中,使用初始化列表进行成员的初始化(方法1)没有问题,而如果不使用初始化列表.直接在函数里用里面注释掉的代码(方法2)则会报错:Base类没有合适的构造函数. // W3-课程作业2-4.cpp : Defines the entry point for the console applicati

构造函数、初始化列表来初始化字段、析构函数、拷贝构造函数

#include <iostream> using namespace std; class Line { public: int getLength( void ); Line( int len ); // 简单的构造函数 Line( const Line &obj); // 拷贝构造函数 ~Line(); // 析构函数 private: int *ptr; }; // 成员函数定义,包括构造函数 Line::Line(int len) { cout << "

C++(二十八) — 构造函数的初始化列表

1.解决的问题: 在 B 类中,组合了一个 A 类对象,其中A类设计了构造函数.由于构造函数的调用规则,设计了构造函数就必须调用,但在定义B类时没有机会初始化A,因此采用构造函数的初始化列表来解决.  2.构造和析构调用顺序 先执行被组合对象的构造函数,如果组合对象有多个,则按照定义顺序,而不是按照初始化列表顺序.   析构函数,和构造函数的调用顺序相反. 举例如下: class A { public: A(int a_) { a = a_; cout << "A的构造函数,a: &

重拾C++之构造函数的初始化列表

"初始化列表少了一次调用默认构造函数的过程,这对于数据密集型的类来说,是非常高效的." 出自:C++ 初始化列表

【校招面试 之 C++】第1题 为什么优先使用构造函数的初始化列表

1.首先看一个例子: #include<iostream> using namespace std; class Test1 { public: Test1() // 无参构造函数 { cout << "Construct Test1" << endl ; } Test1(const Test1& t1) // 拷贝构造函数 { cout << "Copy constructor for Test1" <

c++构造函数的初始化列表(翁恺c++公开课[13])

初始化列表形式: class Point { private: const float x,y; Point(float xa = 0.0, flato ya = 0.0):y(ya),x(xa) {} }; y(ya),x(xa)就是初始化列表的形式,而且是在构造函数被调用之前运行: 从此以后要用这种方式写构造函数的初始化. 原文地址:https://www.cnblogs.com/go-ahead-wsg/p/12210663.html

构造函数的初始化列表抛出异常

即使捕获了,依然会上抛.具体见:http://blog.csdn.net/hikaliv/article/details/4460180 #include <iostream> using namespace std; class A { public: A(int a) try: m_p(new char[a]) { } catch(...) { m_p = NULL; cout << "catch1..." << endl; } ~A() { d

【C/C++】构造函数、默认构造函数、成员初始化列表

常见问题 Q1. 下列关于构造函数的描述中,错误的是( ) A. 构造函数可以设置默认的参数 B. 构造函数在定义类对象时自动执行 C. 构造函数可以是内联函数 D. 构造函数不可以重载 Q2. 下列代码中a.b的各个成员变量值是多少? 1 class Student 2 { 3 public: 4 Student() {} 5 void show(); 6 private: 7 string name; 8 int number; 9 int score; 10 }; 11 Student a

C++ Primer 学习笔记_19_类与数据抽象(5)_初始化列表(const和引用成员)、拷贝构造函数

C++ Primer 学习笔记_19_类与数据抽象(5)_初始化列表(const和引用成员).拷贝构造函数  从概念上将,可以认为构造函数分为两个阶段执行: 1)初始化阶段: 2)普通的计算阶段.计算阶段由构造函数函数体中的所有语句组成. 一.构造函数初始化列表 推荐在构造函数初始化列表中进行初始化 1.对象成员及其初始化 <span style="font-size:14px;">#include <iostream> using namespace std;