精华内容
下载资源
问答
  • 成员初始化列表
    千次阅读
    2018-07-21 17:55:31

    成员初始化列表:

    在类构造函数中,不在函数体内对变量赋值,而在参数列表后,跟一个冒号和初始化列表。

    初始化和赋值对内置类型的成员没有什么大的区别,像上面的人一个构造函数都可以。对非内置类型成员变量,为了避免两次构造,推荐使用类构造函数初始化列表。但是有时候必须使用带初始化列表的构造函数。

    ①:成员类型是没有默认构造函数的类。若没有提供显示初始化,则类创建对象时会调用默认构造函数,如果没有默认构造函数,则必须显示初始化。

    ②:const成员或者引用类型的成员。因为const对象或者引用类型只能初始化,不能赋值。

    为什么成员初始化列表效率更高?

    因为对于非内置类型,少了一次调用默认构造函数的过程。

    更多相关内容
  • C++ Primer中在讲构造函数初始化列表的时候有这么一段话:无论是在构造函数初始化列表中初始化成员,还是在构造函数体中对它们赋值,最终结果是相同的。不同之处在于,使用构造函数初始化列表的版本初始化数据成员,...
  • 1.只能在构造函数初始化列表初始化的成员变量的类型?  a.const成员变量  b.引用类型的成员变量  c.static不能在初始化列表中进行初始化  d.类成员变量中有自定义类型的变量最好在初始化列表中进行初始化 2.初始...
  • 成员初始化列表

    千次阅读 2017-03-18 17:44:29
    2、成员初始经列表由逗号分隔的初始化列表组成(前面带冒号)。它位于参数列表的右括号之后、函数体左括号之前。 3、初值可以是常量或构造函数的参数列表中的参数。这种方法并不限于初始化常量。 例如下代码: Queue:...
        1、对于const数据成员,必须在执行到构造函数体之前,即创建对象时进行初始化
        2、成员初始经列表由逗号分隔的初始化列表组成(前面带冒号)。它位于参数列表的右括号之后、函数体左括号之前
        3、初值可以是常量或构造函数的参数列表中的参数,这种方法并不限于初始化常量
        例如下代码:
        Queue::Queue(int qs) : qsize(qs), front(NULL), rear(NULL), items(0)
        {
        }
        4、只有构造函数可以使用这种初始化列表语法。对于const类成员,必须使用这种语法。另外,对于被声明为引用的类成员,也必须使用这种语法。这是因为引用和cosnt数据类似,只能在被创建时进行初始经。对于简单数据成员使用成员初始化列表和在函数体中使用赋值没有什么区别。
        5、对于本身就是类对象的成员来说,使用成员初始化列表效率更高
        6、从概念上说,这些初始化工作是在对象创建时完成的,此时还未执行括号中的任何代码。
        7、不能将成员初始化列表语法用于构造函数之外的其他类方法
        8、必须用这种格式来初始化非静态const数据成员
        9、必须用这种格式来初始化引用数据成员
    展开全文
  • 在派生类初始化列表直接初始化基类的成员,被称为“越级初始化”,是会报错的。 举个栗子: 我们先创建一个基类,里面有一个int型子对象 class A{ protected: int n;//基类的子对象 public: A(); A...

    喜欢就点个关注丫~

    在这里插入图片描述

    这里所说的“基类的子对象”即基类的数据成员

    在C++中,构造函数不能被继承,因此,派生类的构造函数必须通过调用基类的构造函数来初始化基类子对象。
    在派生类初始化列表直接初始化基类的成员,被称为“越级初始化”,是会报错的。

    举个栗子:
    我们先创建一个基类,里面有一个int型子对象

    class A{
    	protected:
    		int n;//基类的子对象
    	public:
    		A();
    		A(int temp):n(temp){}
    }; 
    

    然后创建一个派生类,并用派生类构造函数的初始化列表来进行“越级初始化”

    class B:public A{
    	public:
    		B(int temp):n(temp){}//对基类子对象n进行初始化
    };
    

    在主函数中调用

    int main()
    {
    	B(1);
    	return 0;
    }
    
    

    结果报错:[Error] class ‘B’ does not have any field named ‘n’

    所以越级初始化是不可以的,但是可以“越级赋值”(自造名词哈哈)

    class B:public A{
    	public:
    		///B(int temp):n(temp){}
    		///改为
    		B(int temp){n=temp};
    };
    

    这样就可以完美运行了。

    因此,派生类的构造函数必须通过调用基类的构造函数初始化基类成员,不能够在派生类初始化列表直接初始化基类的成员

    展开全文
  • C++中的成员初始化列表

    千次阅读 2018-05-09 17:23:05
    C++提供了一种特殊的语法来完成上述工作——成员初始化列表(member initializer list)。因此Queue的构造函数可以写为 Queue::Queue(int qs) :qsize(qs) { front = rear = NULL; items = 0; }  只有构造函数可以...
    class Queue
    {
    private:
    	//Node is a nestedstructure definition local to this c
    	struct Node { Item item; struct Node * next; };
    	enum { Q_SIZE = 10 };
    
    	Node * front;  //pointer to front of Queue
    	Node * rear;  //pointer to rear of Queue
    	int items;  //current number of items in Queue
    	const int qsize;  //maximum number of items in Queue
    	...
    public:
    	...
    };
    Queue::Queue(int qs)
    {
    	front = rear = NULL;
    	items = 0;
    	qsize = qs;  //not acceptable
    }
    

            对Queue类,上述构造函数的实现无法正常进行的原因在于qsize是常量,所以可以对它初始化,但不能给它赋值!从概念上说,调用构造函数时,对象将在括号中的代码执行前被创建。因此调用Queue(int qs)构造函数将导致程序首先给4个成员变量分配内存。然后程序流程进入到括号中,使用常规的赋值方式将值存储到内存中。因此,对于const数据成员,必须在执行到构造函数体前,即创建对象时进行初始化。C++提供了一种特殊的语法来完成上述工作——成员初始化列表(member initializer list)。因此Queue的构造函数可以写为

    Queue::Queue(int qs) :qsize(qs)
    {
    	front = rear = NULL;
    	items = 0;
    }

            只有构造函数可以使用这种初始化列表语法。通常初值可以是常量,也可以是构造函数的参数列表中的参数。所以Queue的构造函数也可以写成

    Queue::Queue(int qs) :qsize(qs), front(NULL), rear(NULL), items(0)
    {
    }

    成员初始化列表的语法

            从概念上讲,上述关于qsize、front、rear、item的初始化工作是在对象创建时完成的,此时还未执行括号中的任何代码。要注意:

            这种格式只能用于构造函数;

            必须用这种形式来初始化非静态const数据成员(至少在C++11之前是这样的);

            必须用这种格式来初始化引用数据成员。这是因为引用与const数据类似,只能在被创建时进行初始化。如下

    class Agent
    {
    private:
    	Agency & belong;
    	...
    };
    Agent::Agent(Agent & a) :belong(a) {...}

    数据成员被初始化的顺序与他们出现在类声明中的顺序相同,与初始化器中的排列顺序无关。

    C++11新增的类内初始化允许使用非静态const成员,因此Queue类的定义可写成

    class Queue
    {
    private:
    	//Node is a nestedstructure definition local to this c
    	struct Node { Item item; struct Node * next; };
    	enum { Q_SIZE = 10 };
    	Node * front = NULL;  
    	Node * rear = NULL;  
    	int items = 0;  
    	const int qsize = Q_SIZE;  
    	...
    public:
    	...
    };
    这与使用成员初始化列表等价。然而,使用成员初始化列表的构造函数将覆盖相应的类内初始化。


    展开全文
  • 首先把数据成员按类型分类 ...因为类类型的数据成员对象在进入函数体是已经构造完成,也就是说在成员初始化列表处进行构造对象的工作,这是调用一个构造函数,在进入函数体之后,进行的是 对已经...
  • 构造函数的成员初始化列表问题

    千次阅读 2018-08-04 10:12:15
    必须在派生类构造函数中初始化的几种情况 派生类构造函数对基类初始化 基类没有显式声明构造函数或者有一个无参数的构造函数,派生类构造函数可以不用对基类初始化,即忽略基类的构造函数, 基类的构造函数全是...
  • C++成员初始化列表

    千次阅读 2018-12-16 14:20:38
    C++类成员初始化列表C++类型定义C++构造函数的初始化列表定义C++构造函数执行的两个阶段为什么使用初始化列表C++里面哪些东西必须放在初始化列表里面成员变量的初始化顺序 这边文章主要学习C++里面的成员初始化列表...
  • C++为类中提供类成员初始化列表 类对象的构造 顺序是这样的:1.分配内存,调用构造函数 时,隐式/显示的初始化各数据 成员2.进入构造函数后在构造函数中执行一般计算 使用初始化列表有两个原因: 1.必须这样做:...
  • 可以使用嵌套的结构或类来声明类成员,也可以将它作为类方法中 的类型名称,但只能在类中使用。可以查看如下示例代码: typedef Customer Item; class Queue { private: struct Node { Item item; struct Node* ...
  • C++ 类(构造函数的成员初始化列表)

    千次阅读 2018-07-21 13:29:52
    构造函数的成员初始化列表 构造函数的成员初始化列表 下面的代码分析了什么时候使用成员初始化列表: class A { private: int a; public: A(int a) { this->a = a; } int getA() { re...
  • 原因:C++可以定义引用类型的成员变量,引用类型的成员变量必须在构造函数的初始化列表中进行初始化。对于类成员是const修饰,或是引用类型的情况,是不允许赋值操作的,(显然嘛,const就是防止被错误赋值的,引用...
  • C++成员初始化列表详解 在初始化类的成员的时候,我们经常会有两种选择,其一是类构造函数的成员初始化列表,其二是构造函数的函数体。那么这两者的区别又是什么,成员初始化列表的具体行为到底是什么呢? ...
  • 使用初始化列表有两个原因: 原因1.必须这样做: 《C++ Primer》中提到在以下三种情况下需要使用初始化成员列表:  情况一、需要初始化的数据成员是对象的情况(这里包含了继承情况下,通过显示调用父类的构造...
  • C++类和对象(下)——初始化列表、static成员和友元

    千次阅读 多人点赞 2021-03-08 09:23:18
    C++类和对象——初始化列表、static成员和友元一、再谈构造函数1.1 构造函数整体赋值1.2 初始化列表三级目录 关于C++类和对象的学习 C++类和对象(上)——类的基本概念、类的限定符及封装和类成员函数的this指针 C++...
  • C++继承、成员访问权限
  • } 采用初始化列表实现了对常量和引用的初始化。采用括号赋值的方法,括号赋值只能用在变量的初始化而不能用在定义之后的赋值。 凡是有引用类型的成员变量或者常量类型的变量的类,不能有缺省构造函数。默认构造函数...
  • c++中的初始化列表

    千次阅读 2022-04-13 21:52:28
    4. 成员变量在类中声明次序就是其在初始化列表中的初始化顺序,与其在初始化列表中的先后次序无关 初始化列表的概念和使用 初始化列表:以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个"成员变量"后面...
  • c++成员变量初始化方法:声明时初始化、初始化列表、构造函数初始化 有人说在声明的时候初始化相当于在构造函数中初始化,其实不是的,成员变量初始化的顺序为:先进行声明时初始化,然后进行初始化列表初始化,最后...
  • 构造函数初始化列表以一个冒号开始,接着是以逗号分隔的数据成员列表,每个数据成员后面跟一个放在括号中的初始化式。例如: class CExample { public: int a; float b; //构造函数初始化列表 CExample(): a(0...
  • 构造函数初始化列表以一个冒号开始,接着是以逗号分隔的数据成员列表,每个数据成员后面跟一个放在括号中的初始化式。例如: class CExample { public: int a; float b; //构造函数初始化列表 CExample(): a(0),b...
  • c++中的初始化列表详解

    万次阅读 多人点赞 2018-05-18 18:15:04
    与其他函数不同,构造函数除了有名字,参数列表和函数体之外,还可以有初始化列表初始化列表以冒号开头,后跟一系列以逗号分隔的初始化字段。 class foo { public: foo(string s, int i):name(s), id(i){} ; //...
  • C++构造函数之初始化列表

    千次阅读 2022-03-04 10:07:39
    C++构造函数的初始化列表详解
  • EnumTest-初始化类的类成员对象(初始化列表方式)
  • 摘要:在C++11之后,声明时初始化->初始化列表->构造函数初始化。
  • 什么时候必须使用初始化列表

    千次阅读 2020-10-18 14:32:37
    2. C++中, 类成员的初始化于初始化列表中完成, 先于构造函数体执行. 即成员真正的初始化发生在初始化列表中, 而不是构造函数体中. 如果类中有一个成员是一个引用, 由于引用必须给予初始值, 因此, 引用必须使用初始...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 799,064
精华内容 319,625
关键字:

成员初始化列表

友情链接: Volume Master.rar