首页 > 其他分享 >必须使用构造函数初始化列表的几种情况

必须使用构造函数初始化列表的几种情况

时间:2023-10-26 11:15:48浏览次数:45  
标签:初始化 int 列表 Test class 构造函数

C++中的普通成员变量可以在构造函数列表里初始化,也可以在构造函数中通过赋值初始化,但以下几种成员变量只能通过初始化列表进行初始化:

1.非静态常量(non-static const)

#include<iostream> 
using namespace std; 
  
class Test { 
    const int t; //C++11之后可以直接在定义后初始化: const int t = 0;
public: 
    Test(int t):t(t) {}  //Initializer list must be used 
    int getT() { return t; } 
}; 
  
int main() { 
    Test t1(10); 
    cout<<t1.getT(); 
    return 0; 
} 
  
/* OUTPUT: 
   10  
*/

2.引用 (reference)

#include<iostream> 
using namespace std; 
  
class Test { 
    int &t; 
public: 
    Test(int &t):t(t) {}  //Initializer list must be used 
    int getT() { return t; } 
}; 
  
int main() { 
    int x = 20; 
    Test t1(x); 
    cout<<t1.getT()<<endl; 
    x = 30; 
    cout<<t1.getT()<<endl; 
    return 0; 
} 
/* OUTPUT: 
    20 
    30 
 */

3.没有默认构造函数的对象 (objects which do not have default constructor)

#include <iostream> 
using namespace std; 

class A { 
    int i; 
public: 
    A(int ); 
}; 

A::A(int arg) { 
    i = arg; 
    cout << "A's Constructor called: Value of i: " << i << endl; 
} 

// Class B contains object of A 
class B { 
    A a; 
public: 
    B(int ); 
}; 

B::B(int x):a(x) { //Initializer list must be used 
    cout << "B's Constructor called"; 
} 

int main() { 
    B obj(10); 
    return 0; 
} 
/* OUTPUT: 
    A's Constructor called: Value of i: 10 
    B's Constructor called 
*/

4.派生类初始化基类对象 (base class members)

#include <iostream> 
using namespace std; 

class A { 
    int i; 
public: 
    A(int ); 
}; 

A::A(int arg) { 
    i = arg; 
    cout << "A's Constructor called: Value of i: " << i << endl; 
} 

// Class B is derived from A 
class B: A { 
public: 
    B(int ); 
}; 

B::B(int x):A(x) { //Initializer list must be used 
    cout << "B's Constructor called"; 
} 

int main() { 
    B obj(10); 
    return 0; 
} 

注:1.当构造函数参数和成员变量相同时,必须通过构造函数列表初始化或者通过this指针赋值。

       2.构造函数初始化列表初始化顺序与成员变量声明顺序相同

       2.使用构造函数初始化列表拥有更好的性能,见以下例子

#include <iostream>
using namespace std;

class Type
{
public:
    Type() { 
        cout << "default constructor called." << endl; 
    }

    Type(const Type &t) { 
        cout << "copy constructor called." << endl; 
    }

    Type& operator= (const Type &t) {
        if (this == &t)
            return *this;
        cout << "assignment operator called." << endl;
        return *this;
    }
};

class TestA
{
    Type a;
public:
    TestA(const Type &t):a(t) { //a调用一次拷贝构造函数
    }
};

class TestB
{
    Type b;
public:
    TestB(const Type &t) {
        b = t;  //b先调用默认构造函数,再调用赋值操作符
    }
};

int main()
{
    Type t;
    cout << "-----Test A--------" << endl;
    TestA a(t);

    cout << "-----Test B--------" << endl;
    TestB b(t);

    return 0;
}

 

 

参考链接:https://www.geeksforgeeks.org/when-do-we-use-initializer-list-in-c/

标签:初始化,int,列表,Test,class,构造函数
From: https://www.cnblogs.com/Sleuth/p/11843500.html

相关文章

  • 虚拟机初始化配置
    虚拟机初始化配置网络配置在vmvare的虚拟网络编辑器中找到可用的网段打开虚拟网络编辑器进入设置,虚拟机可设置的ip范围就是192.168.239.128—192.168.239.254。在linux的配置文件中配置静态IP配置文件路径vim/etc/sysconfig/network-scripts/ifcfg-ens33TYPE=......
  • Linux-编译源码时所需提前安装的常用依赖包列表
    编译源码时所需提前安装的常用依赖包列表:yum-yinstallgccgcc-c++autoconflibjpeglibjpeg-devellibpnglibpng-develfreetypefreetype-devellibxml2libxml2-develzlibzlib-develglibcglibc-develglib2glib2-develbzip2bzip2-develncursesncurses-develcur......
  • go list查看包可用列表
    ➜awesomeProjectgolist-m-versions"github.com/gin-gonic/gin"github.com/gin-gonic/ginv1.1.1v1.1.2v1.1.3v1.1.4v1.3.0v1.4.0v1.5.0v1.6.0v1.6.1v1.6.2v1.6.3v1.7.0v1.7.1v1.7.2v1.7.3v1.7.4v1.7.5v1.7.6v1.7.7v1.8.0v1.8.1v1.8.2......
  • 前端面试题:原型 / 构造函数 / 实例
    1、原型/构造函数/实例原型(prototype): 一个简单的对象,用于实现对象的继承构造函数:可通过new来新建一个对象的函数实例:通过构造函数和new创建出的对象实例通过__proto__指向原型通过constructor指向构造函数缺个图?实例上......
  • Java笔记——数组静态初始化开始
    一维数组:静态初始化:定义格式:(1)数据类型[]数组名=new数组类型[](2)数组类型[]数组名={元素1,元素2,.....}练习:数组元素逆序:publicstaticvoidmain(String[]args){int[]arr={1,2,3,4,5,6,7,8,9,10};System.out.println("逆序前:");for(inti......
  • Python 面向对象编程:类、对象、初始化和方法详解
    Python是一种面向对象的编程语言。在Python中,几乎所有东西都是对象,都具有其属性和方法。类似于对象构造函数或用于创建对象的“蓝图”的类。创建一个类要创建一个类,请使用关键字class:示例,创建一个名为MyClass的类,其中包含一个名为x的属性:classMyClass:x=5创建......
  • Python 面向对象编程:类、对象、初始化和方法详解
    Python是一种面向对象的编程语言。在Python中,几乎所有东西都是对象,都具有其属性和方法。类似于对象构造函数或用于创建对象的“蓝图”的类。创建一个类要创建一个类,请使用关键字class:示例,创建一个名为MyClass的类,其中包含一个名为x的属性:classMyClass:x=5创......
  • git初始化命令(备忘录)
    首先你得先创建好仓库,然后知道仓库地址,接下来你才能接下来:(1)提交路径:gitremoteaddorigin你要上传的仓库地址(2)确认添加文件:gitadd. (添加所有文件)(3)提交备注:gitcommit-m“提交信息”(双引号里面可以中文,说明这次提交的备注内容)(4)提交命令:gitpush-uoriginmaster(上传......
  • C#中列表List的创建与使用
    一、创建空列表方式一List<string>pkValues=newList<string>(); 方式二varpkValues=newList<string>(); 二、初始化创建varpkValues2=newList<string>{"SH230907001","SH230907003","SH230909001"}; 三、插入......
  • 安防监控视频汇聚平台EasyCVR增加AI算法列表接口的实现方法
    安防监控视频汇聚平台EasyCVR基于云边端一体化架构,具有强大的数据接入、处理及分发能力,可提供视频监控直播、云端录像、云存储、录像检索与回看、智能告警、平台级联、云台控制、语音对讲、智能分析等功能。平台既具备传统安防监控的能力,也支持提供AI算力算法接入的能力。今天我们......