C++ 初始化列表(二)

C++类中成员变量的初始化有两种方式:

构造函数初始化列表和构造函数体内赋值

1 内部数据类型(char,int……指针等)

class Animal{public:    Animal(int weight,int height):       //A初始化列表      m_weight(weight),      m_height(height)    {    }    Animal(int weight,int height)       //B函数体内初始化    {        m_weight = weight;        m_height = height;    }private:    int m_weight;    int m_height;};

对于这些内部类型来说,基本上是没有区别的,效率上也不存在多大差异。

当然A和B方式不能共存的。

2 无默认构造函数的继承关系中

class Animal{public:    Animal(int weight,int height):        //没有提供无参的构造函数       m_weight(weight),      m_height(height)    {}private:    int m_weight;    int m_height;};

class Dog: public Animal{public:    Dog(int weight,int height,int type)   //error 构造函数 父类Animal无合适构造函数    {    }private:    int m_type;};

这种必须在派生类中构造函数中初始化提供父类的初始化,因为对象构造的顺序是:

父类——子类——……

所以必须:

class Dog: public Animal{public:    Dog(int weight,int height,int type):        Animal(weight,height)         //必须使用初始化列表增加对父类的初始化    {        ;    }private:    int m_type;};

3 类中const常量,必须在初始化列表中初始,不能使用赋值的方式初始化

class Dog: public Animal{public:    Dog(int weight,int height,int type):        Animal(weight,height),         LEGS(4)                //必须在初始化列表中初始化    {        //LEGS = 4;           //error    }private:    int m_type;    const int LEGS;};

4 包含有自定义数据类型(类)对象的成员初始化

class Food{public:    Food(int type = 10)    {        m_type = 10;    }    Food(Food &other)                 //拷贝构造函数    {        m_type = other.m_type;    }    Food & operator =(Food &other)      //重载赋值=函数    {        m_type = other.m_type;        return *this;    }private:    int m_type;};

(1)构造函数赋值方式 初始化成员对象m_foodclass Dog: public Animal{public:    Dog(Food &food)      //:m_food(food)      {        m_food = food;               //初始化 成员对象    }private:    Food m_food;};//使用Food fd;Dog dog(fd);   //Dog dog(fd);结果:先执行了   对象类型构造函数Food(int type = 10)——> 然后在执行 对象类型构造函数Food & operator =(Food &other)想象是为什么?

(2)构造函数初始化列表方式class Dog: public Animal{public:    Dog(Food &food)      :m_food(food)                  //初始化 成员对象    {        //m_food = food;                   }private:    Food m_food;};//使用Food fd;Dog dog(fd);   //Dog dog(fd);结果:执行Food(Food &other)拷贝构造函数完成初始化

不同的初始化方式得到不同的结果:

      明显构造函数初始化列表的方式得到更高的效率。

时间: 2024-10-14 00:45:03

C++ 初始化列表(二)的相关文章

从Qt谈到C++(二):继承时的含参基类与初始化列表

提出疑问 当我们新建一个Qt的图形界面的工程时,我们可以看看它自动生成的框架代码,比如我们的主窗口名称为MainWindow,我们来看看mainwindow.cpp文件: MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { } 不同于一般的继承,这里的父类的括号里带有参数,我们通常都使用过不带参数,甚至不带括号的基类名称.这里的基类为什么带着参数呢? C++继承与构造函数

C++学习笔记18,C++11中的初始化列表构造函数(二)

C++11中的初始化列表构造函数(Initialize_list Constructors)是将std::initializer_list<T>作为第一个参数的构造函数,并且没有任何其他参数(或者其他参数具有默认值).例如: #include <iostream> #include <initializer_list>//必须包含该头文件 #include <vector> using namespace std; class A { private: ve

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

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

c++11之初始化列表

一.前言 C++的学习中,我想每个人都被变量定义和申明折磨过,比如我在大学笔试过的几家公司,都考察了const和变量,类型的不同排列组合,让你区别有啥不同.反正在学习C++过程中已经被折磨惯了,今天再来看看重温下那段"辉煌的历史".先来看一段代码: Player pa; // (a) Player pb(); // (b) Player pc = Player(); // (c) Player pd(Player()); // (d) pd = Player() // (e) a,b,

c++初始化列表

何谓初始化列表 与其他函数不同,构造函数除了有名字,参数列表和函数体之外,还可以有初始化列表,初始化列表以冒号开头,后跟一系列以逗号分隔的初始化字段.在C++中,struct和class的唯一区别是默认的访问性不同,而这里我们不考虑访问性的问题,所以下面的代码都以struct来演示. struct foo { string name ; int id ; foo(string s, int i):name(s), id(i){} ; // 初始化列表 }; 构造函数的两个执行阶段 构造函数的执行

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

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

数组的初始化和二维数组、指针与数组

1.数组的初始化,比较简单,实例程如下: #include<stdio.h> # define M 12 int main(void){ int days[M]={31,28,31,30,31,30,31,30,30,31,30,31}; int i; for(i=0;i<M;i++) printf("Months %d has %2d days.\n",i+1,days[i]); return 0; } 运行结果如下: 2.未经初始化的数组: 实例程序: #incl

从初始化列表和构造函数谈C++的初始化机制

来源:http://blog.csdn.net/theprinceofelf/article/details/20057359 前段时间被人问及"初始化列表和构造有什么区别?"我竟一时语塞,只好回头 拿起几本C++的大部头书,打开VS2012和vim开始倒腾.最后总结出如下几点,希望 对大家理解C++能有些帮助.(题外话:我认为好的技术书籍和师者对人最大的帮助 就是:帮助学者节省时间.) 综合而言,C++中类的初始化操作有四个部分组成: 1.初始化列表:所有类非静态数据成员都可以在这里

初始化列表的用法说明

类对象的构造顺序是这样的:1.分配内存,调用构造函数时,隐式/显示的初始化各数据成员2.进入构造函数后在构造函数中执行一般计算 使用初始化列表有两个原因: 1.必须这样做:   <C++ Primer>中提到在以下三种情况下需要使用初始化成员列表: 一.需要初始化的数据成员是对象的情况:二.需要初始化const修饰的类成员:三.需要初始化引用成员数据:        如果我们有一个类成员,它本身是一个类或者是一个结构,而且这个成员它只有一个带参数的构造函数,而没有默认构造函数,这时要对这个类成