100个windows平台C++开发异常之十四初始化有关问题

100个windows平台C++开发错误之十四初始化问题

by zxy,Java/C++编程交流群:168424095

(66)变量

内置类型变量是否初始化决定于变量的定义位置,在函数体外定义的变量都自动初始化为0,函数体内定义的变量都不进行自动初始化。类类型变量的初始化,类通过定义一个或多个构造函数来控制类对对象的初始化,如果定义某个类的变量时没有提供初始化式,这个类就通过默认构造函数来实现。

(67)引用

引用必须被初始化,必须用左值来初始化,必须用与该引用同类型的对象初始化。

int ival= 1024;

int &refVal=ival; // ok: refVal refers to ival

int &refVal2;      // 错误:引用必须被初始化

int &refVal3= 10; // 错误:必须用对象进行初始化

(68)const引用

const引用是指向 const 对象的引用。const 引用可以初始化为不同但相关的类型的对象或者初始化为右值,如字面值常量。

constint ival = 1024;

int &ref2=ival; //错误:非const引用指向const对象

const int &refVal = ival; //正确:引用和对象都是const

可以读取但不能修改const引用,因此,任何对const引用的赋值都是不合法的。

ref2是普通的非 const 引用,因此可以用来修改 ref2 指向的对象的值。通过 ref2 ival 赋值会导致修改const对象的值。为阻止这样的修改,需要规定将普通的引用绑定到const对象是不合法的。

(69)const而非define定义整型常量

原因:#define定义的宏没有参数类型,只是简单的替换,不会加入到符号列表中。

(70)error C2440: “初始化”:无法从“const char *”转换为“char *”

char *ch =string("11").c_str();

改为

const char *ch =string("11").c_str();

1楼modyaj昨天 10:28
69的错误是因为宏定义在结束的时候加上的分号造成的吧!const更安全。
Re: one_in_one1小时前
回复modyajn谢谢,改正了,这个例子确实是。很久之前遇到的问题,不记得当初是什么状况了。