[C++再学习系列] 变量与声明时初始化

简介:

      未初始化的变量常常会导致一些奇怪的bug,有时还真不好调式。养成在初始化变量的习惯有利于减少编程错误,提高程序质量。

      C++提供了构造和析构函数,其中构造函数就是为初始化而设计的;对于内置变量(char,int,long等)的初始化C++无能为力,其默认行为是未初始化,故其值依赖于变量类型(是否为static)和编译器。

      本文中将讨论两类基本变量:标量和数组,标量指单一变量,数组本质上就是一整块内存空间(别忘了memset)。其他数据结构均基于这两类基本变量,一般由库提供,比如著名的C++ STL容器。

 

声明时初始化的格式直接参见代码中的注释。

 

复制代码

  
  
1 #include < errno.h >
2 #include < math.h >
3 #include < stdio.h >
4 #include < stdlib.h >
5 #include < string .h >
6
7   void Print( int * buf, int len)
8 {
9 printf( " Value(int)= " );
10 for ( int i = 0 ; i < len; ++ i)
11 {
12 printf( " %d " , buf[i]);
13 }
14 printf( " \n " );
15 }
16
17   void Print( char * buf, int len)
18 {
19 printf( " Value(char)= " );
20 for ( int i = 0 ; i < len; ++ i)
21 {
22 printf( " %c " , buf[i]);
23 }
24 printf( " \n " );
25 }
26
27 int main( int argc, char ** argv)
28 {
29 printf( " scale variable:\n " );
30 // 1. scale variable
31 char v1; // not initialization. Value depends on compiler
32 Print( & v1, 1 );
33
34 char v2 = ' 1 ' ; // user initialization
35 Print( & v2, 1 );
36
37 char * v3 = new char ; // not initialization. Value depends on compiler
38 Print(v3, 1 );
39
40 char * v4 = new char (); // zeroing initialization. value is 0;
41 Print(v4, 1 );
42
43 char * v5 = new char ( ' A ' ); // user initialization
44 Print(v5, 1 );
45
46 int * i5 = new int ( 1243214 ); // user initialization
47 Print(i5, 1 );
48
49
50 printf( " array variable:\n " );
51 // 2. array
52 char a[ 10 ]; // not initialization. Value depends on compiler
53 Print(a, 10 );
54
55 char b[ 10 ] = {}; // same as {0}; zeroing initialization.
56 Print(b, 10 );
57
58 char b1[ 10 ] = { ' a ' }; // b[0]='a', other is 0!
59 Print(b1, 10 );
60
61 char * c = new char [ 10 ]; // not initialization. Value depends on compiler
62 Print(c, 10 );
63
64 char * d = new char [ 10 ](); // zeroing initialization. 追海逐风 证实,g++无此功能
65 Print(d, 10 );
66
67 // char* e = new char[10]('a'); // Error: ISO C++ forbids initialization in array new
68 // Print(e, 10);
69
70 return 0 ;
71 }
72
复制代码
本文转自 zhenjing 博客园博客,原文链接: http://www.cnblogs.com/zhenjing/archive/2010/10/12/1848616.html    ,如需转载请自行联系原作者
相关文章
|
4月前
|
存储 C++
C++语言中指针变量int和取值操作ptr详细说明。
总结起来,在 C++ 中正确理解和运用 int 类型地址及其相关取值、设定等操纵至关重要且基础性强:定义 int 类型 pointer 需加星号;初始化 pointer 需配合 & 取址;读写 pointer 执向之处需配合 * 解引用操纵进行。
481 12
|
存储 编译器 C++
【C++】深入探索类和对象:初始化列表及其static成员与友元(一)
【C++】深入探索类和对象:初始化列表及其static成员与友元
295 2
|
8月前
|
编译器 C++ 容器
【c++11】c++11新特性(上)(列表初始化、右值引用和移动语义、类的新默认成员函数、lambda表达式)
C++11为C++带来了革命性变化,引入了列表初始化、右值引用、移动语义、类的新默认成员函数和lambda表达式等特性。列表初始化统一了对象初始化方式,initializer_list简化了容器多元素初始化;右值引用和移动语义优化了资源管理,减少拷贝开销;类新增移动构造和移动赋值函数提升性能;lambda表达式提供匿名函数对象,增强代码简洁性和灵活性。这些特性共同推动了现代C++编程的发展,提升了开发效率与程序性能。
346 12
|
算法 网络安全 区块链
2023/11/10学习记录-C/C++对称分组加密DES
本文介绍了对称分组加密的常见算法(如DES、3DES、AES和国密SM4)及其应用场景,包括文件和视频加密、比特币私钥加密、消息和配置项加密及SSL通信加密。文章还详细展示了如何使用异或实现一个简易的对称加密算法,并通过示例代码演示了DES算法在ECB和CBC模式下的加密和解密过程,以及如何封装DES实现CBC和ECB的PKCS7Padding分块填充。
296 4
2023/11/10学习记录-C/C++对称分组加密DES
|
11月前
|
C++ 开发者
C++学习之继承
通过继承,C++可以实现代码重用、扩展类的功能并支持多态性。理解继承的类型、重写与重载、多重继承及其相关问题,对于掌握C++面向对象编程至关重要。希望本文能为您的C++学习和开发提供实用的指导。
174 16
|
编译器 C++
C++ 类构造函数初始化列表
构造函数初始化列表以一个冒号开始,接着是以逗号分隔的数据成员列表,每个数据成员后面跟一个放在括号中的初始化式。
229 30
|
编译器 C语言 C++
配置C++的学习环境
【10月更文挑战第18天】如果想要学习C++语言,那就需要配置必要的环境和相关的软件,才可以帮助自己更好的掌握语法知识。 一、本地环境设置 如果您想要设置 C++ 语言环境,您需要确保电脑上有以下两款可用的软件,文本编辑器和 C++ 编译器。 二、文本编辑器 通过编辑器创建的文件通常称为源文件,源文件包含程序源代码。 C++ 程序的源文件通常使用扩展名 .cpp、.cp 或 .c。 在开始编程之前,请确保您有一个文本编辑器,且有足够的经验来编写一个计算机程序,然后把它保存在一个文件中,编译并执行它。 Visual Studio Code:虽然它是一个通用的文本编辑器,但它有很多插
525 6
|
存储 编译器 数据安全/隐私保护
【C++篇】C++类与对象深度解析(四):初始化列表、类型转换与static成员详解2
【C++篇】C++类与对象深度解析(四):初始化列表、类型转换与static成员详解
187 3
|
编译器 C++
【C++篇】C++类与对象深度解析(四):初始化列表、类型转换与static成员详解1
【C++篇】C++类与对象深度解析(四):初始化列表、类型转换与static成员详解
299 3
【C++】深入探索类和对象:初始化列表及其static成员与友元(二)
【C++】深入探索类和对象:初始化列表及其static成员与友元
128 3