26 个解决方案
#1
int a(5);//初始化
a = 8;//赋值
#2
对象初始化就是在使用对象之前给它的各个成员变量赋初值。
#3
为什么对象初始化要复制构造函数,而给对象赋值不要?
#4
初始化 调用 构造函数
对象赋值 调用 赋值函数
对象赋值 调用 赋值函数
#5
简单来说,c中的初始化是指定义一个变量后马上赋值,是一个连续的过程,而赋值是
指定义后并没有显式的给定值,这时根据定义变量的方式不同,编译器给它的初始值也不同,
这里的赋值至少两个语句,一个是定义,一个是赋值。如
int a;
int a = 10;
而初始化则是
int a = 10;
c++类似,但是涉及到类的可能复杂一下,这和构造函数有关。
指定义后并没有显式的给定值,这时根据定义变量的方式不同,编译器给它的初始值也不同,
这里的赋值至少两个语句,一个是定义,一个是赋值。如
int a;
int a = 10;
而初始化则是
int a = 10;
c++类似,但是涉及到类的可能复杂一下,这和构造函数有关。
#6
汗,打完字的时候地板都没了。
#7
顶下
#8
哈哈 地板没了,就地下室呗~! 把你顶上去..
#9
int a=10;//初始化,调用构造函数
int b;
b=12;//赋值,
赋值是在产生对象后再给对象赋得值
效率问题
如果是int float等内置对象,两种无多少差异,因为他们不存在构造和析构函数。
而如果是类则不一样了,类有构造和析构的过程
所以是类的话用初始化这种形式效率高些
#10
既然是初始化,就意味着以前没有这个对象,现在要创建这个对象,自然要用构造函数。如果你是用另外一个对象来初始化这个对象,调用的就是复制构造函数。
class A
{};//里面有些定义的函数
A a;//调用无参数的构造函数
A b(a);//调用拷贝构造函数
如果是用无参的构造函数,仅是分配对象使用的内存,然后把其成员变量赋上些默认值(通常是这样的)。拷贝构造函数,则是将其成员变量赋上和a一样的值。
赋值是已经存在的一个对象,你不需要构建一个新的对象,自然不用构造函数。虽然它的内部实现通常和拷贝构造函数类似。但是构造函数还会做一些其他的操作。
#11
int a ;
a = 10 ;
这是赋值
int a = 10 ;
这是初始化
a = 10 ;
这是赋值
int a = 10 ;
这是初始化
#12
我看书上说只要是按值传递就会调用构造函数,
在赋值的时候,如果是按值传递,是不是要调用构造函数???
在赋值的时候,如果是按值传递,是不是要调用构造函数???
#13
你可以 当成类来理解啊
class A
{
构造函数吧 ------》初始化用的
重载 操作符 “=”------》 赋值用的
}
这两个东西 在创建一个类的时候 基本上你不用操心 因为都有默认的这两个函数 这样看你能理解么?
class A
{
构造函数吧 ------》初始化用的
重载 操作符 “=”------》 赋值用的
}
这两个东西 在创建一个类的时候 基本上你不用操心 因为都有默认的这两个函数 这样看你能理解么?
#14
我不光想说看书,还想说多实践。
#15
最大的区别,初始化是对象本身还不存在,赋值就表示对象本身已经存在。
#16
举一个例子:
被编译器扩展成:
对于赋值:
被编译器扩展成:
因此,赋值实际上就是由编译隐式的构造一个临时对象。
这也是为什么初始化比赋值效率高的原因所在。
class A{
public:
A(string s):str(s){}
private:
string str;
};
被编译器扩展成:
class A{
public:
A(string s):str(s){
str.string::string(s);
private:
string str;
};
对于赋值:
class A{
public:
A(string s){
str = s;
private:
string str;
};
被编译器扩展成:
class A{
public:
A(string s){
string temp;
temp.string::string(s);
str = temp;
temp.~string();
}
private:
string str;
};
因此,赋值实际上就是由编译隐式的构造一个临时对象。
这也是为什么初始化比赋值效率高的原因所在。
#17
貌似构造函数的效率要稍高一点吧,所以建议使用初始化。
#18
初始化可以看作是构造过程的一部分;
而赋值,当然是有了对象才能给它赋值,因为它是构造完成之后的动作。
从效果上看,就是初始化会导致某个构造函数被调用,而赋值则导致operator=被调用。不过对于内建类型,这种区别就看不出来了。
而赋值,当然是有了对象才能给它赋值,因为它是构造完成之后的动作。
从效果上看,就是初始化会导致某个构造函数被调用,而赋值则导致operator=被调用。不过对于内建类型,这种区别就看不出来了。
#19
初始化调用构造函数,赋值调用赋值函数。
#20
对于类包含类的问题,构造函数在构造对象的过程中,也可以细分为:
初始化和赋值。
初始化和赋值。
#21
a(8); 这是在编译期完成的,
a = 8; 这是在执行期完成的, = 是个操作符
a = 8; 这是在执行期完成的, = 是个操作符
#22
如果我猜得不错的话,你所谓书上说的按值传递,应该是指函数调用时,使用按值传递吧。
如果是函数调用时,会产生一个实参的拷贝,传到被调用的函数中,所以会构建一个新的对象,用拷贝构造函数。
赋值没有按值传递这样讲,就是把一个已存在对象的值赋给另一以存在对象,为什么要构造,构造就会产生一个新的对象。
#23
对于非内建类型。。。
你会很清楚的看到。。初始化调用构造函数,而赋值是调用operator=这个函数。。
你会很清楚的看到。。初始化调用构造函数,而赋值是调用operator=这个函数。。
#24
赋值的时候可以重载=运算符 做相关操作
初始化就是拷贝构造函数之类的 构造函数
初始化就是拷贝构造函数之类的 构造函数
#25
对像初始化是在编译时完成的,比如,int a=10;在编译阶段,在数据区的某个地址会确定一个值,这个值就是10.而a=10,则是在程序运行期间对数据区的某个地址进行了一次操作。
两者发生的时段不同
两者发生的时段不同
#26
#1
int a(5);//初始化
a = 8;//赋值
#2
对象初始化就是在使用对象之前给它的各个成员变量赋初值。
#3
为什么对象初始化要复制构造函数,而给对象赋值不要?
#4
初始化 调用 构造函数
对象赋值 调用 赋值函数
对象赋值 调用 赋值函数
#5
简单来说,c中的初始化是指定义一个变量后马上赋值,是一个连续的过程,而赋值是
指定义后并没有显式的给定值,这时根据定义变量的方式不同,编译器给它的初始值也不同,
这里的赋值至少两个语句,一个是定义,一个是赋值。如
int a;
int a = 10;
而初始化则是
int a = 10;
c++类似,但是涉及到类的可能复杂一下,这和构造函数有关。
指定义后并没有显式的给定值,这时根据定义变量的方式不同,编译器给它的初始值也不同,
这里的赋值至少两个语句,一个是定义,一个是赋值。如
int a;
int a = 10;
而初始化则是
int a = 10;
c++类似,但是涉及到类的可能复杂一下,这和构造函数有关。
#6
汗,打完字的时候地板都没了。
#7
顶下
#8
哈哈 地板没了,就地下室呗~! 把你顶上去..
#9
int a=10;//初始化,调用构造函数
int b;
b=12;//赋值,
赋值是在产生对象后再给对象赋得值
效率问题
如果是int float等内置对象,两种无多少差异,因为他们不存在构造和析构函数。
而如果是类则不一样了,类有构造和析构的过程
所以是类的话用初始化这种形式效率高些
#10
既然是初始化,就意味着以前没有这个对象,现在要创建这个对象,自然要用构造函数。如果你是用另外一个对象来初始化这个对象,调用的就是复制构造函数。
class A
{};//里面有些定义的函数
A a;//调用无参数的构造函数
A b(a);//调用拷贝构造函数
如果是用无参的构造函数,仅是分配对象使用的内存,然后把其成员变量赋上些默认值(通常是这样的)。拷贝构造函数,则是将其成员变量赋上和a一样的值。
赋值是已经存在的一个对象,你不需要构建一个新的对象,自然不用构造函数。虽然它的内部实现通常和拷贝构造函数类似。但是构造函数还会做一些其他的操作。
#11
int a ;
a = 10 ;
这是赋值
int a = 10 ;
这是初始化
a = 10 ;
这是赋值
int a = 10 ;
这是初始化
#12
我看书上说只要是按值传递就会调用构造函数,
在赋值的时候,如果是按值传递,是不是要调用构造函数???
在赋值的时候,如果是按值传递,是不是要调用构造函数???
#13
你可以 当成类来理解啊
class A
{
构造函数吧 ------》初始化用的
重载 操作符 “=”------》 赋值用的
}
这两个东西 在创建一个类的时候 基本上你不用操心 因为都有默认的这两个函数 这样看你能理解么?
class A
{
构造函数吧 ------》初始化用的
重载 操作符 “=”------》 赋值用的
}
这两个东西 在创建一个类的时候 基本上你不用操心 因为都有默认的这两个函数 这样看你能理解么?
#14
我不光想说看书,还想说多实践。
#15
最大的区别,初始化是对象本身还不存在,赋值就表示对象本身已经存在。
#16
举一个例子:
被编译器扩展成:
对于赋值:
被编译器扩展成:
因此,赋值实际上就是由编译隐式的构造一个临时对象。
这也是为什么初始化比赋值效率高的原因所在。
class A{
public:
A(string s):str(s){}
private:
string str;
};
被编译器扩展成:
class A{
public:
A(string s):str(s){
str.string::string(s);
private:
string str;
};
对于赋值:
class A{
public:
A(string s){
str = s;
private:
string str;
};
被编译器扩展成:
class A{
public:
A(string s){
string temp;
temp.string::string(s);
str = temp;
temp.~string();
}
private:
string str;
};
因此,赋值实际上就是由编译隐式的构造一个临时对象。
这也是为什么初始化比赋值效率高的原因所在。
#17
貌似构造函数的效率要稍高一点吧,所以建议使用初始化。
#18
初始化可以看作是构造过程的一部分;
而赋值,当然是有了对象才能给它赋值,因为它是构造完成之后的动作。
从效果上看,就是初始化会导致某个构造函数被调用,而赋值则导致operator=被调用。不过对于内建类型,这种区别就看不出来了。
而赋值,当然是有了对象才能给它赋值,因为它是构造完成之后的动作。
从效果上看,就是初始化会导致某个构造函数被调用,而赋值则导致operator=被调用。不过对于内建类型,这种区别就看不出来了。
#19
初始化调用构造函数,赋值调用赋值函数。
#20
对于类包含类的问题,构造函数在构造对象的过程中,也可以细分为:
初始化和赋值。
初始化和赋值。
#21
a(8); 这是在编译期完成的,
a = 8; 这是在执行期完成的, = 是个操作符
a = 8; 这是在执行期完成的, = 是个操作符
#22
如果我猜得不错的话,你所谓书上说的按值传递,应该是指函数调用时,使用按值传递吧。
如果是函数调用时,会产生一个实参的拷贝,传到被调用的函数中,所以会构建一个新的对象,用拷贝构造函数。
赋值没有按值传递这样讲,就是把一个已存在对象的值赋给另一以存在对象,为什么要构造,构造就会产生一个新的对象。
#23
对于非内建类型。。。
你会很清楚的看到。。初始化调用构造函数,而赋值是调用operator=这个函数。。
你会很清楚的看到。。初始化调用构造函数,而赋值是调用operator=这个函数。。
#24
赋值的时候可以重载=运算符 做相关操作
初始化就是拷贝构造函数之类的 构造函数
初始化就是拷贝构造函数之类的 构造函数
#25
对像初始化是在编译时完成的,比如,int a=10;在编译阶段,在数据区的某个地址会确定一个值,这个值就是10.而a=10,则是在程序运行期间对数据区的某个地址进行了一次操作。
两者发生的时段不同
两者发生的时段不同