首页 > 编程语言 >C++ 成员初始化列表

C++ 成员初始化列表

时间:2023-08-20 16:49:00浏览次数:38  
标签:初始化 ... 成员 C++ 列表 value Example

成员初始化列表

成员初始化列表时对象初始化成员变量的一种方法。使用方式如下(两种书写习惯)

ClassName(args): varName1(value), ... , varNameN(value){
    // 这是一个构造函数
    // ...CODE...
}

ClassName(args)
    : varName1(value), ... , varNameN(value){
    // 这是一个构造函数
    // ...CODE...
}

注意:C++ 初始化类成员时,是按照声明的顺序初始化的,而不是按照出现在初始化列表中的顺序。

下面是一段代码:

#include<iostream>

using namespace std;

class Example {
public:
	Example() {
		cout << "The Example Class is loaded." << endl;
	}
	Example(string str) {
		cout << "The Example Class is loaded with " << str << "." << endl;
	}
};

class Entity {
private:
	string m_name;
	Example m_e;
public:
	Entity()
		:m_name("Unknowen") {
		m_e = Example("Test");
	}

	Entity(string name)
		: m_name(name) {}
	string getName() const {
		return m_name;
	}
};

int main() {
	Entity e;
	return 0;
}

在这段代码中,我们使用了成员初始化列表给 m_name 做了初始化。但是 m_e 没有使用。

这段代码运行后,输出了:

The Example Class is loaded.
The Example Class is loaded with Test.

可见我们实例化了两个Example对象。在声明 m_e 时创建了一个。在给 m_e 初始化时创建了一个。之前的对象完全被丢掉了,使用了新的对象。这样就造成了性能损失。我们可以通过成员初始化列表来避免这个问题。

修改后的代码如下:

#include<iostream>

using namespace std;

class Example {
public:
	Example() {
		cout << "The Example Class is loaded." << endl;
	}
	Example(string str) {
		cout << "The Example Class is loaded with " << str << "." << endl;
	}
};

class Entity {
private:
	string m_name;
	Example m_e;
public:
	Entity()
		:m_name("Unknowen"),m_e(Example("Test")) {}

	Entity(string name)
		: m_name(name) {}
	string getName() const {
		return m_name;
	}
};

int main() {
	Entity e;
	return 0;
}

这段代码的运行结果为:

The Example Class is loaded with Test.

相同的,诸如string类型(类)的变量在初始化时也可能出现这种情况。虽然基础类型(诸如int,double等)不会出现这种情况,不过还是推荐统一使用成员初始化列表来做初始化。

标签:初始化,...,成员,C++,列表,value,Example
From: https://www.cnblogs.com/orzmiku/p/17644208.html

相关文章

  • C++ const和mutable
    const和mutable这里只说const在c++中的特殊用法。用const修饰函数的成员函数。被const修饰的成员函数无法修改函数内的其他成员。可以认为这个函数变成了一个“只读”的状态。Likethis://注意const在括号后面,不要写成constxxxxx(){...}了intgetStatus()const{ returnm......
  • C++ new和delete
    new关键字在C++中,当我们在函数内声明一个变量时,变量会被放在栈(stack)中。栈中的内存离开代码块就被释放了。而且栈的内存很小,当我们声明了大量变量可能会导致内存不足。内存除了栈以外,还有堆(heap),当我们在函数外声明一个全局变量时,这个变量就放在堆上。堆是程序未使用的内存,可以被......
  • c++ 丢失笔记 [运算符重载、this指针、复制与拷贝构造、生存周期、箭头操作符]
    运算符重载、this指针、复制与拷贝构造、生存周期、箭头操作符有一部分是学校的OJ里做题需要就提前学了,然后没记笔记,有一部分是笔记丢了。不打算补这些笔记。不过还是在这里mark一下++运算符的重载。因为++运算符可以前置也可以后置,所以这里需要注意一下,如果是后置++,需要一个in......
  • C++ 隐式转换与explicit关键字
    隐式转换与explicit关键字隐式转换函数构造的隐式转换,直接上代码:#include<bits/stdc++.h>classEntity{private: std::stringm_Name; intm_Age;public: Entity(conststd::string&name) :m_Name(name),m_Age(-1){} Entity(intage) :m_Name("Unknown"),m_A......
  • C++ Vector数组优化
    Vector数组优化问题这是一段没有优化的代码:#include<iostream>#include<vector>classEntity{public: intx,y;public: Entity(intx,inty) :x(x),y(y){} Entity(constEntity&e) :x(e.x),y(e.y){ std::cout<<"Copied!"<<st......
  • C++ 智能指针
    智能指针使用智能指针需要引入memory头文件unique_ptr#include<iostream>#include<string>#include<memory>classEntity{public: Entity(){ std::cout<<"CreatedEntity!"<<std::endl; } ~Entity(){ std::cout<<&q......
  • C++ 链接库
    C++中使用库分为两种,静态库和动态库。简单来说,静态库最后会被编译进二进制文件,动态库不会,需要二进制文件从外部载入。以下操作均在VisualStudio2022中进行,以32位GLFW为例子(glfw.org)。首先下载glfw32位的可执行程序。在解决方案目录创建一个Dependencies文件夹(名字无所谓),然后......
  • C++ 创建库并使用
    创建库并使用!>使用VisualStudio2022创建项目和解决方案首先创建一个空项目,这里叫Game,同时VisualStudio会帮你创建解决方案。这个项目是我们的应用程序。创建项目来存库!>以静态库为例、右键解决方案,添加新项目Engine。此时就有了两个项目,Game和Engine:打开E......
  • C++ 类
    类类是一种把数据和功能结合在一起的方法。使用class来定义一个类,像这样:classPlayer{//创建一个Player类intx=0,y=0;intspeed=1;};通过类创建一个对象(实例化),像这样:Playerplayer;成员变量可以使用点(.)来访问对象的属性。player.speed=2;但......
  • C++ 类和结构体内外的Static
    类和结构体外的Static这里的static指的是在类外的static,意味着你要声明的是static的符号,链接将只在内部。(换句话说作用域只在他所在的.cpp文件)。下面是几组例子来理解:例子1:main.cpp#include<iostream>usingnamespacestd;voidfun(){cout<<"fun()inmain.cpp"......