c++ - 非参数化构造函数的目的是什么?
问题描述
在非参数化构造函数中初始化类的数据成员有什么好处吗?就像,如果它不带参数,在非参数化构造函数中初始化类数据成员不像直接在类中初始化值?例子:
class persons {
private:
int age, id;
public:
persons(){
age = 2;
id = 3;
}
};
--> 我们也可以这样做:
class persons {
private:
int age = 2, id = 3;
};
那么,默认构造函数的目的是什么?
解决方案
在旧的 C++ 版本中,类中的属性声明不能包含初始化。不同的说法
class persons {
int age = 3;
}
不正确,成员只能在构造函数中接收值。
但是初始化和赋值还是有区别的。基本类型无关紧要,但会为用户定义的类使用不同的特殊成员。
例子:
#include <iostream>
// dummy class displaying messages for initializations and assignment
class A {
int val;
public:
A(int x = 0) : val(x) { // initializing constructor
std::cerr << "Construction from " << x << "\n";
}
A& operator =(int x) { // assignment operator
val = x;
std::cerr << "Assignment from " << x << "\n";
return *this;
}
};
// 3 classes showing various "initialization" methods
class B {
A a = 2; // initialization with an implicit default CTOR
};
class C {
A a;
public:
C() : a(3) {}; // initialization
};
class D {
A a; // default initialization
public:
D() {
a = 4; // assignment
}
};
int main() {
B b;
C c;
D d;
return 0;
}
输出确实是:
Construction from 2
Construction from 3
Construction from 0
Assignment from 4
成员声明中的特殊初始化在所有构造函数之间共享(无论是隐式的还是显式的),并在构造函数的主体之前应用。在任何情况下,成员的初始化都是按照其声明的顺序应用的。
推荐阅读
- sql - 匹配没有国民身份证的人
- web-scraping - 美丽的汤4,findAll
- reactjs - 如何在 React JS 中创建全局可访问的变量
- marklogic - MarkLogic - 数据库中文档子集的属性范围索引
- c# - 从trupulse 360 C#读取数据
- php - 我想在 codeigniter 中加入 4 个表
- docker - 在 TF Serving 中为多个 TF 模型提供服务并根据请求创建适当的客户端请求以与特定模型进行交互
- android - RecyclerView 滞后于 NestedScrollView
- django - 在 django 的模型中两次使用相同的外键作为不同的字段
- sql - 双重过滤具有唯一值和与某个字符串匹配的值的联接表