请问C++中初始化和赋值的区别~求指教
来自《C++ primer》里的一段话
Initialization is not assignment. Initialization happens when a variable is given a value when it is created. Assignment obliterates an object's current value and replaces that value with a new one.
这段话大概看得懂,但为什么赋值是消灭一个对象现在的值?
例如:
int a = 3;
int b = a;
int a = 3;
int b;
b = a;
这两个例子中b的赋值有什么本质的区别吗? c++ initialization assignment primer 赋值
[解决办法]
第一种是分一块内存,同时用数值填进去,第二种是分一块内存(随机值),稍后用数值填进去
[解决办法]
简单点讲
初始化是调用构造函数
赋值是调用赋值函数 一般是二进制覆盖 当然也可以做别的处理
从类的角度来理解会更简单
[解决办法]
在循环外,初始化和赋值效果是相同的,在循环体内
for(....)
{
int i=4;//第二次及其之后,不会再赋值i=4
.....
i++;
}
[解决办法]
对,你可以int a = 3;
int b;
然后输出b的值看看,就知道了
[解决办法]
赋值和初始化的区别在某些地方是有严格的区分的,某些地方只能使用初始化而不能使用赋值。比如一个类A如果创建之后就不能赋值了的话,那么它只能进行初始化。如果某个类B包含了一个上面所说的类A,那么在B的构造函数中只能使用初始化列表来初始化类B中的那个类A。另外某些地方是具有初始化的含义的,比如参数的传递。C++之父的书上对这些问题描述得很详细,我就不多说了。
在我看来其他的地方初始化和赋值并没有什么特别值得关注的地方。类似自动变量如果不初始化值就是不定的这种问题就属于不值得特别关注的东西,因为初始化的习惯是凌驾于这个事实之上的。
[解决办法]
初始化有两种方式,第一种,加载是初始化,C 外部变量和静态变量,采用这种方式
第二种,编译器,安排初始化代码初始化
C局部非静态变量(自动变量和寄存器变量)
C++ Pod 类型外部变量和文件静态变量,采用加载是初始化,其他静态变量,可能会是其中的一种,方式看编译器。
C++ 对象初始化,一般采用代码初始化。
其实和赋值差不多,不过调用构造函数,节省构造临时变量的过程。
即使用临时变量赋值初始化,实际上大部分和直接调用构造函数的结果一致。
只有少数特别定义的类型,结果和赋值相同,这种被一些人称为赋值初始化。
变量赋值,必须用现存对象,所以如果用临时变量赋值( a = classA ()),多了一个构造临时变量的过程。
如果用没有初始化的对象,赋值,结果未定义,和野指针有的一比。
Ps :
1)
初始化,可能比赋值少调用一个构造函数和一个析构函数
所以,能初始化的就不要赋值。
2)初始化后数据是有定义的,赋值要看赋值的方式。
如果,用一个没有初始化(没有定义时初始化,也没有赋值)的变量赋值,结果未定义,值随机。
用常量赋值,结果是确定的。
二者没有区别
[解决办法]
所谓初始,就是第一次。第一次给变量定义是需要分配内存的。
赋值时,只需要用现值替换原值就可以了。