1 概述
C++ 11初始化有多种方式,这里只说明列表初始化并且按照字段是初始化。
2 实例1
include <iostream>
#include <string>
// 定义一个结构体
struct GainIndex {
int rx1Index;
int rx2Index;
int rx1MaxIndex;
int rx2MaxIndex;
int rx1MinIndex;
int rx2MinIndex;
};
int main() {
// 使用列表初始化来指定字段初始化
GainIndex gainIndex = {
.rx1Index = 64,
.rx2Index = 60,
.rx1MaxIndex = 127,
.rx2MaxIndex = 127,
.rx1MinIndex = 0,
.rx2MinIndex = 0
};
std::cout << "gainIndex.rx1Index = " << gainIndex.rx1Index << std::endl;
std::cout << "gainIndex.rx2Index = " << gainIndex.rx2Index << std::endl;
std::cout << "gainIndex.rx1MaxIndex = " << gainIndex.rx1MaxIndex << std::endl;
std::cout << "gainIndex.rx2MaxIndex = " << gainIndex.rx2MaxIndex << std::endl;
std::cout << "gainIndex.rx1MinIndex = " << gainIndex.rx1MinIndex << std::endl;
std::cout << "gainIndex.rx2MinIndex = " << gainIndex.rx2MinIndex << std::endl;
return 0;
}
运行:
gainIndex.rx1Index = 64
gainIndex.rx2Index = 60
gainIndex.rx1MaxIndex = 127
gainIndex.rx2MaxIndex = 127
gainIndex.rx1MinIndex = 0
gainIndex.rx2MinIndex = 0
3 实例2
上面实例代码很直观,但实际上rx1MaxIndex,rx2MaxIndex,rx1MinIndex和rx2MinIndex这四个变量值不常修改,如果在初始中省略将会简化初始列表。
修改代码如下:
#include <iostream>
#include <string>
// 定义一个结构体
struct GainIndex {
GainIndex()
: rx1MaxIndex(127)
, rx2MaxIndex(127)
, rx1MinIndex(0)
, rx2MinIndex(0)
{}
int rx1Index;
int rx2Index;
int rx1MaxIndex;
int rx2MaxIndex;
int rx1MinIndex;
int rx2MinIndex;
};
int main() {
// 使用列表初始化来指定字段初始化
GainIndex gainIndex = {
.rx1Index = 64,
.rx2Index = 60
};
std::cout << "gainIndex.rx1Index = " << gainIndex.rx1Index << std::endl;
std::cout << "gainIndex.rx2Index = " << gainIndex.rx2Index << std::endl;
std::cout << "gainIndex.rx1MaxIndex = " << gainIndex.rx1MaxIndex << std::endl;
std::cout << "gainIndex.rx2MaxIndex = " << gainIndex.rx2MaxIndex << std::endl;
std::cout << "gainIndex.rx1MinIndex = " << gainIndex.rx1MinIndex << std::endl;
std::cout << "gainIndex.rx2MinIndex = " << gainIndex.rx2MinIndex << std::endl;
return 0;
}
编译:
$ g++ -std=c++98 init1.cpp -o init1
init1.cpp: In function ‘int main()’:
init1.cpp:23:15: error: in C++98 ‘gainIndex’ must be initialized by constructor, not by ‘{...}’
23 | GainIndex gainIndex = {
| ^~~~~~~~~
init1.cpp:26:2: error: could not convert ‘{64, 60}’ from ‘<brace-enclosed initializer list>’ to ‘GainIndex’
26 | };
| ^
| |
| <brace-enclosed initializer list>
看来有有了构造函数后,就没法使用{}方式初始化对象了。
使用C++11标准编译:
$ g++ -std=c++11 init1.cpp -o init1
init1.cpp: In function ‘int main()’:
init1.cpp:26:2: error: could not convert ‘{64, 60}’ from ‘<brace-enclosed initializer list>’ to ‘GainIndex’
26 | };
| ^
| |
| <brace-enclosed initializer list>
看来C++ 11也不可以。
修改代码如下:
struct GainIndex {
int rx1Index = 0;
int rx2Index = 0;
int rx1MaxIndex = 127;
int rx2MaxIndex = 127;
int rx1MinIndex = 0;
int rx2MinIndex = 0;
};
int main() {
// 使用列表初始化来指定字段初始化
GainIndex gainIndex = {
.rx1Index = 64,
.rx2Index = 60
};
std::cout << "gainIndex.rx1Index = " << gainIndex.rx1Index << std::endl;
std::cout << "gainIndex.rx2Index = " << gainIndex.rx2Index << std::endl;
std::cout << "gainIndex.rx1MaxIndex = " << gainIndex.rx1MaxIndex << std::endl;
std::cout << "gainIndex.rx2MaxIndex = " << gainIndex.rx2MaxIndex << std::endl;
std::cout << "gainIndex.rx1MinIndex = " << gainIndex.rx1MinIndex << std::endl;
std::cout << "gainIndex.rx2MinIndex = " << gainIndex.rx2MinIndex << std::endl;
return 0;
}
编译通过,运行结果:
gainIndex.rx1Index = 64
gainIndex.rx2Index = 60
gainIndex.rx1MaxIndex = 127
gainIndex.rx2MaxIndex = 127
gainIndex.rx1MinIndex = 0
gainIndex.rx2MinIndex = 0
4 总结
C++要想使用{}按字段初始化对象,对象不能有构造函数。