初始化变量的不同方法
Different ways to initialize variables
在c++中有不同的初始化变量的方法。int z(3)
等于int z=3
。
int z;
z(3);
与
相同int z;
z=3;
?
您可以使用:
int z;
z = 3;
或只是:
int z = 3;
或:
int z(3);
或:
int z = int(3);
z(3);
本身语法无效。唯一有效的方法是,如果你有一个叫做z
的函数,你传入整数3。但即使这样也不一定会将局部变量z
设置为3。
int z(3);
将只能在c++中编译(而不是C)。
int z;
z=3;
是有效的语法,将z
设置为3。
int z(3)
和int z; z=3;
在本例中是相同的
不,z(3);
正在调用一个名为z
的函数,参数为3
如果你想用这种语法进行初始化你需要在声明
中进行初始化int z(3):
你可以像这样初始化z
int z{3};
自c++ 11
以来,这是初始化变量的推荐方法。语法的优点是,当存在缩小转换时,它会给出一个错误,即如果不能保证值将适合目标变量,则会得到一个编译错误。该语法可用于任何对象。
参考:条目7,Effective Modern c++ by Scott Meyers
不,第一个选项是不正确的:最烦人的解析。编译器认为z
是一个函数。然而,这些也基本上是相同的:
int z(3);
int z = 3;
请注意,它们在本例中是相同的,但在对象上,第一个调用匹配的构造函数,而第二个需要重载复制赋值操作符(=
)
正如AndersK所建议的,在c++中初始化变量的最佳方法是使用{}。因为它保证了类型安全,所以让我们进一步讨论它。
类型安全
c++中的每个对象都是根据其类型使用的,对象在使用前需要初始化。
安全初始化:{}
编译器在类型转换期间防止信息丢失。例如,int a{7};
初始化OKint b{7.5}
编译器显示错误,因为信息丢失。
不安全初始化:= or ()
编译器不保护类型转换期间的信息丢失。int a = 7
初始化OKint a = 7.5
初始化正常,信息丢失。a的实际值将变为7.0int c(7)
初始化OKint c(7.5)
初始化正常,但会丢失信息。a的实际值将变为7.0
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- 枚举环境变量的惯用C++14/C++17方法
- 绑定派生类方法C++从实例范围之外的分隔 std::function 变量调用
- 是否可以依赖函数范围的静态变量来执行程序关闭期间调用的方法?
- 从私有成员变量的成员方法返回unique_ptr
- 在派生类中使用基类的私有成员变量的最佳方法
- 打印所有继承的类成员变量和方法
- C++方法中的引用变量
- Visual C++: MSVC vs. GCC+CLANG: 处理 lambda 捕获类成员变量,正确的方法是什么?
- 有没有一种通用的方法来实现不变量
- 有没有将变量名称转换为双指针的简短方法?
- C++:将向量传递到构造函数以创建成员变量的最佳方法?
- C++ 互斥锁可以交叉方法/变量吗?如果是这样,为什么在这里不起作用?
- 类方法变量,如果将它们存储在类本身中会更快吗?
- 将局部方法变量分配给类指针
- 列出派生类中的所有方法/变量
- 相互冲突名称的成员变量和方法变量
- C++如果我有一个对象指针,是在堆栈或堆上分配的方法变量
- 如何从另一个类访问一个类的方法/变量,而不在c++中实例化它或子类
- 指定类变量与方法变量C++