The New C++ -- 变量 (3. 变量的初始化)
2012-02-10 11:43
211 查看
我们知道当变量被定义之后,编译器就会在内存中预留一段存储空间。C++和C语言一样,当这段内存空间被预留出来之后,如果不是特殊情况(我们稍后再讲),编译器并不会将这段内存空间写入一个初始值。在我们给这个变量赋值之前,这段存储空间里的值是乱七八糟的随机值,他甚至可能是别的程序运行完毕后在这段存储空间留下的值。
未初始化的变量是危险的,因为当你不小心使用了一个未初始化,也未赋值的变量,程序的运行结果是未知的。例如下面这个例子你无法知道num_students打印出来是什么值,每次运行程序都可能不一样。
即使你总记得使用一个变量之前先赋值,阅读和维护你写的代码的人却可能犯错,幸运的是现代大部分编译器都会给出使用了一个未初始化的变量的警告。但这还不够好,但如何从根本上解决这个问题呢?那就是在变量定义的时候将其初始化,将变量初始化是一个很好的编程习惯。下面的例子都是变量的初始化,
对于我们提到过的基本数据类型而言,变量的初始化其实和赋值很相似。你可以把初始化看成变量定义之后的直接赋值。但对于用户自定义的一些复合类型来说(例如类),初始化和赋值是两个完全不同的操作。我们以后会详细提及。
在C++中,初始化并不仅仅有一种方法,还有好几种方法可以将变量初始化,大部分方法对基本数据类型来说并不常用,但是对用户自定义类型来说却很常用。本小节将其他几种初始化的方法都罗列出来,以后遇到还会详细讲述。
第一,变量的初始化可以由变量后面紧跟着一个`=’,后面再跟着初始化的数值。这是我们刚才提过的,不再详述。
第二,变量初始化可以由变量后面紧跟着括号`(‘和`)’,初始化的数值括在括号里面。例如,
第三,变量的初始化可以由变量后面紧跟着`=’,后面再跟花括号`{‘和`}’将初始化的值括起来,或者变量后面直接跟着花括号`{‘和`}‘和括起来的初始化的值,例如,
如果花括号里面没有数值,对于基本数据类型来说,就相当于将他们初始化为0。例如,
小知识:在第二条中,括号`(‘和`)’里面什么都没有也可以表示变量初始化为0。但是只是在某些特殊情况下成立,我们以后遇到了会具体指出。在一般情况下,例如下例,是不成立的。
int num_rows();
这个例子不表示将num_rows初始化为0,而表示一个函数的声明。关于函数我们稍后会详细讲述。因为括号初始化经常会和C++的其他语法(特别是函数的声明和函数的类型说明符)有歧义,在所有情况下都用花括号来初始化不失为一个良好的选择。
注意,花括号的初始化语法是C++11的新标准,旧的编译器可能不支持。
第四,变量后面紧跟着`=’,后面再跟着类型说明符加上一个括号或者花括号也表示初始化。初始化的值即是括号或花括号括起来的值。例如,
这里如果括号或者花括号里面什么都没有,对于基本数据类型来说就是将变量的值初始化为0。例如,
小知识:类型说明符后面跟着括号但括号里什么都没有这种情况,有时候也是有歧义的。像int()这样的语句用在某些地方可能会表示一个函数的类型说明符。我们会在后面章节详细讲述。但是在上例中并没有任何歧义,因为等号的右边不可能是一个类型说明符,而只可能是一个数值。
未初始化的变量是危险的,因为当你不小心使用了一个未初始化,也未赋值的变量,程序的运行结果是未知的。例如下面这个例子你无法知道num_students打印出来是什么值,每次运行程序都可能不一样。
int num_students; std::cout << num_students << std::endl;
即使你总记得使用一个变量之前先赋值,阅读和维护你写的代码的人却可能犯错,幸运的是现代大部分编译器都会给出使用了一个未初始化的变量的警告。但这还不够好,但如何从根本上解决这个问题呢?那就是在变量定义的时候将其初始化,将变量初始化是一个很好的编程习惯。下面的例子都是变量的初始化,
int num_subjects = 7; int average_score = 87; int total_score = average_score * num_subjects;
对于我们提到过的基本数据类型而言,变量的初始化其实和赋值很相似。你可以把初始化看成变量定义之后的直接赋值。但对于用户自定义的一些复合类型来说(例如类),初始化和赋值是两个完全不同的操作。我们以后会详细提及。
在C++中,初始化并不仅仅有一种方法,还有好几种方法可以将变量初始化,大部分方法对基本数据类型来说并不常用,但是对用户自定义类型来说却很常用。本小节将其他几种初始化的方法都罗列出来,以后遇到还会详细讲述。
第一,变量的初始化可以由变量后面紧跟着一个`=’,后面再跟着初始化的数值。这是我们刚才提过的,不再详述。
第二,变量初始化可以由变量后面紧跟着括号`(‘和`)’,初始化的数值括在括号里面。例如,
int num_subjects(7); int average_score(87); int total_score(average_score * num_subjects);
第三,变量的初始化可以由变量后面紧跟着`=’,后面再跟花括号`{‘和`}’将初始化的值括起来,或者变量后面直接跟着花括号`{‘和`}‘和括起来的初始化的值,例如,
int num_subjects = {7}; int average_score{87}; int total_score = {average_score * num_subjects};
如果花括号里面没有数值,对于基本数据类型来说,就相当于将他们初始化为0。例如,
int num_rows = { }; int num_cols{ };
小知识:在第二条中,括号`(‘和`)’里面什么都没有也可以表示变量初始化为0。但是只是在某些特殊情况下成立,我们以后遇到了会具体指出。在一般情况下,例如下例,是不成立的。
int num_rows();
这个例子不表示将num_rows初始化为0,而表示一个函数的声明。关于函数我们稍后会详细讲述。因为括号初始化经常会和C++的其他语法(特别是函数的声明和函数的类型说明符)有歧义,在所有情况下都用花括号来初始化不失为一个良好的选择。
注意,花括号的初始化语法是C++11的新标准,旧的编译器可能不支持。
第四,变量后面紧跟着`=’,后面再跟着类型说明符加上一个括号或者花括号也表示初始化。初始化的值即是括号或花括号括起来的值。例如,
int num_rows = int(3); int num_cols = int{4};
这里如果括号或者花括号里面什么都没有,对于基本数据类型来说就是将变量的值初始化为0。例如,
int num_rows = int(); int num_cols = int{};
小知识:类型说明符后面跟着括号但括号里什么都没有这种情况,有时候也是有歧义的。像int()这样的语句用在某些地方可能会表示一个函数的类型说明符。我们会在后面章节详细讲述。但是在上例中并没有任何歧义,因为等号的右边不可能是一个类型说明符,而只可能是一个数值。
相关文章推荐
- The New C++ -- 变量 (2. 变量的赋值和输入)
- The New C++ -- 变量(4. const限定符和constexpr说明符 )
- The New C++ -- 变量 (5. sizeof表达式,typeid表达式和地址操作符)
- The New C++ -- 变量 (6. 变量名的声明点和作用域)
- The New C++ -- 变量 (7. 左值,右值)
- The New C++ -- 变量(0)
- The New C++ -- 变量(1. 变量的声明和定义)
- C++成员变量的初始化
- C/C++ 中变量的声明、定义、初始化的区别
- C++成员变量的初始化方式
- c++基础:普通变量初始化与类内初始值初始化的不同
- C++中创建、初始化以及删除 以变量为大小的动态二维数组
- C++中各种类型的成员变量的初始化方法(mark-好)
- [转]C/C++关于全局变量和局部变量初始化与不初始化的区别
- 【C++】_002_变量初始化/过滤字符及标点/bitset/const/VC字符串常量
- C++成员变量、构造函数的初始化顺序
- C++中成员变量的初始化方法
- Question 33: How can a C++ developer use the placement new syntax to make new allocate an object of class SomeClass at a particu
- The New C++
- c++全局变量初始化与不初始化