对像初始化和给对象赋值的区别?

时间:2022-11-16 19:45:46
对像初始化和给对象赋值的区别?  如果回答看书这之类的就请不要回答。

26 个解决方案

#1


int a(5);//初始化

a = 8;//赋值

#2


对象初始化就是在使用对象之前给它的各个成员变量赋初值。

#3


为什么对象初始化要复制构造函数,而给对象赋值不要?

#4


初始化 调用 构造函数
对象赋值 调用 赋值函数

#5


简单来说,c中的初始化是指定义一个变量后马上赋值,是一个连续的过程,而赋值是
指定义后并没有显式的给定值,这时根据定义变量的方式不同,编译器给它的初始值也不同,
这里的赋值至少两个语句,一个是定义,一个是赋值。如
int a;
int a = 10;
而初始化则是
int a = 10;

c++类似,但是涉及到类的可能复杂一下,这和构造函数有关。

#6


引用 5 楼 lingyin55 的回复:
简单来说,c中的初始化是指定义一个变量后马上赋值,是一个连续的过程,而赋值是
指定义后并没有显式的给定值,这时根据定义变量的方式不同,编译器给它的初始值也不同,
这里的赋值至少两个语句,一个是定义,一个是赋值。如
int a;
int a = 10;
而初始化则是
int a = 10;

c++类似,但是涉及到类的可能复杂一下,这和构造函数有关。


汗,打完字的时候地板都没了。

#7


顶下

#8


引用 6 楼 lingyin55 的回复:
引用 5 楼 lingyin55 的回复:
简单来说,c中的初始化是指定义一个变量后马上赋值,是一个连续的过程,而赋值是
指定义后并没有显式的给定值,这时根据定义变量的方式不同,编译器给它的初始值也不同,
这里的赋值至少两个语句,一个是定义,一个是赋值。如
int a;
int a = 10;
而初始化则是
int a = 10;

c++类似,但是涉及到类的可能复杂一下,这和构造函数有关。


汗,打完字的时候地板都没了。


哈哈 地板没了,就地下室呗~! 把你顶上去..

#9


引用楼主 icefox163 的回复:
对像初始化和给对象赋值的区别?  如果回答看书这之类的就请不要回答。


int a=10;//初始化,调用构造函数
int b;
b=12;//赋值,
赋值是在产生对象后再给对象赋得值
  效率问题
如果是int float等内置对象,两种无多少差异,因为他们不存在构造和析构函数。
而如果是类则不一样了,类有构造和析构的过程
所以是类的话用初始化这种形式效率高些

#10


引用 3 楼 icefox163 的回复:
为什么对象初始化要复制构造函数,而给对象赋值不要?


既然是初始化,就意味着以前没有这个对象,现在要创建这个对象,自然要用构造函数。如果你是用另外一个对象来初始化这个对象,调用的就是复制构造函数。
class A
{};//里面有些定义的函数

A a;//调用无参数的构造函数
A b(a);//调用拷贝构造函数

如果是用无参的构造函数,仅是分配对象使用的内存,然后把其成员变量赋上些默认值(通常是这样的)。拷贝构造函数,则是将其成员变量赋上和a一样的值。

赋值是已经存在的一个对象,你不需要构建一个新的对象,自然不用构造函数。虽然它的内部实现通常和拷贝构造函数类似。但是构造函数还会做一些其他的操作。

#11


int  a ;
a = 10 ;
这是赋值

int  a = 10 ;

这是初始化

#12


我看书上说只要是按值传递就会调用构造函数,

在赋值的时候,如果是按值传递,是不是要调用构造函数???

#13


你可以 当成类来理解啊
class A
{
   构造函数吧 ------》初始化用的

   重载 操作符 “=”------》 赋值用的
}
这两个东西 在创建一个类的时候 基本上你不用操心 因为都有默认的这两个函数 这样看你能理解么?

#14


我不光想说看书,还想说多实践。

#15


引用楼主 icefox163 的回复:
对像初始化和给对象赋值的区别?  如果回答看书这之类的就请不要回答。

最大的区别,初始化是对象本身还不存在,赋值就表示对象本身已经存在。

#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


引用 4 楼 rendao0563 的回复:
初始化 调用 构造函数
 对象赋值 调用 赋值函数

貌似构造函数的效率要稍高一点吧,所以建议使用初始化。

#18


初始化可以看作是构造过程的一部分;
而赋值,当然是有了对象才能给它赋值,因为它是构造完成之后的动作。
从效果上看,就是初始化会导致某个构造函数被调用,而赋值则导致operator=被调用。不过对于内建类型,这种区别就看不出来了。

#19


初始化调用构造函数,赋值调用赋值函数。

#20


对于类包含类的问题,构造函数在构造对象的过程中,也可以细分为:
初始化和赋值。

#21


    a(8); 这是在编译期完成的,
 a = 8; 这是在执行期完成的, = 是个操作符


#22


引用 12 楼 icefox163 的回复:
我看书上说只要是按值传递就会调用构造函数,

在赋值的时候,如果是按值传递,是不是要调用构造函数???


如果我猜得不错的话,你所谓书上说的按值传递,应该是指函数调用时,使用按值传递吧。
如果是函数调用时,会产生一个实参的拷贝,传到被调用的函数中,所以会构建一个新的对象,用拷贝构造函数。

赋值没有按值传递这样讲,就是把一个已存在对象的值赋给另一以存在对象,为什么要构造,构造就会产生一个新的对象。

#23


对于非内建类型。。。
你会很清楚的看到。。初始化调用构造函数,而赋值是调用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++类似,但是涉及到类的可能复杂一下,这和构造函数有关。

#6


引用 5 楼 lingyin55 的回复:
简单来说,c中的初始化是指定义一个变量后马上赋值,是一个连续的过程,而赋值是
指定义后并没有显式的给定值,这时根据定义变量的方式不同,编译器给它的初始值也不同,
这里的赋值至少两个语句,一个是定义,一个是赋值。如
int a;
int a = 10;
而初始化则是
int a = 10;

c++类似,但是涉及到类的可能复杂一下,这和构造函数有关。


汗,打完字的时候地板都没了。

#7


顶下

#8


引用 6 楼 lingyin55 的回复:
引用 5 楼 lingyin55 的回复:
简单来说,c中的初始化是指定义一个变量后马上赋值,是一个连续的过程,而赋值是
指定义后并没有显式的给定值,这时根据定义变量的方式不同,编译器给它的初始值也不同,
这里的赋值至少两个语句,一个是定义,一个是赋值。如
int a;
int a = 10;
而初始化则是
int a = 10;

c++类似,但是涉及到类的可能复杂一下,这和构造函数有关。


汗,打完字的时候地板都没了。


哈哈 地板没了,就地下室呗~! 把你顶上去..

#9


引用楼主 icefox163 的回复:
对像初始化和给对象赋值的区别?  如果回答看书这之类的就请不要回答。


int a=10;//初始化,调用构造函数
int b;
b=12;//赋值,
赋值是在产生对象后再给对象赋得值
  效率问题
如果是int float等内置对象,两种无多少差异,因为他们不存在构造和析构函数。
而如果是类则不一样了,类有构造和析构的过程
所以是类的话用初始化这种形式效率高些

#10


引用 3 楼 icefox163 的回复:
为什么对象初始化要复制构造函数,而给对象赋值不要?


既然是初始化,就意味着以前没有这个对象,现在要创建这个对象,自然要用构造函数。如果你是用另外一个对象来初始化这个对象,调用的就是复制构造函数。
class A
{};//里面有些定义的函数

A a;//调用无参数的构造函数
A b(a);//调用拷贝构造函数

如果是用无参的构造函数,仅是分配对象使用的内存,然后把其成员变量赋上些默认值(通常是这样的)。拷贝构造函数,则是将其成员变量赋上和a一样的值。

赋值是已经存在的一个对象,你不需要构建一个新的对象,自然不用构造函数。虽然它的内部实现通常和拷贝构造函数类似。但是构造函数还会做一些其他的操作。

#11


int  a ;
a = 10 ;
这是赋值

int  a = 10 ;

这是初始化

#12


我看书上说只要是按值传递就会调用构造函数,

在赋值的时候,如果是按值传递,是不是要调用构造函数???

#13


你可以 当成类来理解啊
class A
{
   构造函数吧 ------》初始化用的

   重载 操作符 “=”------》 赋值用的
}
这两个东西 在创建一个类的时候 基本上你不用操心 因为都有默认的这两个函数 这样看你能理解么?

#14


我不光想说看书,还想说多实践。

#15


引用楼主 icefox163 的回复:
对像初始化和给对象赋值的区别?  如果回答看书这之类的就请不要回答。

最大的区别,初始化是对象本身还不存在,赋值就表示对象本身已经存在。

#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


引用 4 楼 rendao0563 的回复:
初始化 调用 构造函数
 对象赋值 调用 赋值函数

貌似构造函数的效率要稍高一点吧,所以建议使用初始化。

#18


初始化可以看作是构造过程的一部分;
而赋值,当然是有了对象才能给它赋值,因为它是构造完成之后的动作。
从效果上看,就是初始化会导致某个构造函数被调用,而赋值则导致operator=被调用。不过对于内建类型,这种区别就看不出来了。

#19


初始化调用构造函数,赋值调用赋值函数。

#20


对于类包含类的问题,构造函数在构造对象的过程中,也可以细分为:
初始化和赋值。

#21


    a(8); 这是在编译期完成的,
 a = 8; 这是在执行期完成的, = 是个操作符


#22


引用 12 楼 icefox163 的回复:
我看书上说只要是按值传递就会调用构造函数,

在赋值的时候,如果是按值传递,是不是要调用构造函数???


如果我猜得不错的话,你所谓书上说的按值传递,应该是指函数调用时,使用按值传递吧。
如果是函数调用时,会产生一个实参的拷贝,传到被调用的函数中,所以会构建一个新的对象,用拷贝构造函数。

赋值没有按值传递这样讲,就是把一个已存在对象的值赋给另一以存在对象,为什么要构造,构造就会产生一个新的对象。

#23


对于非内建类型。。。
你会很清楚的看到。。初始化调用构造函数,而赋值是调用operator=这个函数。。

#24


赋值的时候可以重载=运算符  做相关操作
初始化就是拷贝构造函数之类的 构造函数  

#25


对像初始化是在编译时完成的,比如,int a=10;在编译阶段,在数据区的某个地址会确定一个值,这个值就是10.而a=10,则是在程序运行期间对数据区的某个地址进行了一次操作。
两者发生的时段不同

#26


对像初始化和给对象赋值的区别?对像初始化和给对象赋值的区别?