首页 > 试题广场 >

有如下程序段,则程序输出为?

[单选题]
有如下程序段:
#include <stdio.h>
class A
{
public:
    A()
    {
        printf("1");
    }
    A(A &a)
    {
        printf("2");
    }
    A &operator=(const A &a)
    {
        printf("3");
        return *this;
    }
};
int main()
{
    A a;
    A b = a;
}
则程序输出为:
  • 12
  • 13
  • 无法确定
  • 编译出错
推荐
A a,定义一个对象,毫无疑问调用构造函数
A b=a,这是定义了对象b,且以a对b进行初始化,这个时候需要调用拷贝构造函数。
如果写成A a;A b;b=a;则是调用后面重载的赋值函数,这种情况应该输出113。
这个题主要考察赋值和初始化的区别。
编辑于 2018-11-16 09:34:09 回复(16)
在定义时赋初值调用拷贝构造函数,只有先定义后赋值,才会调用重载的赋值运算符。
发表于 2015-10-13 23:47:33 回复(0)
初始化和赋值的区别
A b = a; // 这是调用拷贝构造函数,是初始化
A b;
b = a; // 这是赋值,调用operator=
发表于 2018-06-03 20:43:05 回复(0)
NWU头像 NWU
详解 A b = a;
此情况属于:一个对象(b)需要通过另外一个对象(a)进行初始化
这种情况需要利用拷贝构造函数,除此之外,还有两种情况需要调用拷贝构造函数
(1) 一个对象以值传递的方式传入函数体  
(2)一个对象以值传递的方式从函数返回
此外,还需掌握调用赋值运算符的场景。
发表于 2016-01-06 20:33:05 回复(0)
A a,这是初始化,调用构造函数,输出1;
A b=a,这个是复制构造函数,所以输出2,所以结果是12,选A
编辑于 2018-11-16 09:33:33 回复(3)
拷贝构造和复制构造函数的区别主要是:
   拷贝构造函数:有生成新的对像  
  赋值操作符:没有生成新的对像
发表于 2018-07-21 09:34:51 回复(0)
此题的拷贝构造函数,准确的说,参数应该加const
A(const A&)
发表于 2016-08-06 20:46:05 回复(1)
#include<stdio.h>
class A{
	public:
		A(){
			printf("1");
		}
		A(A &a){
			printf("2");
		}
		A &operator =(const A &A){
			printf("3");
			return *this;
		}
};
int main (void){
	A a;
	A B = a;
	a = B;
}
Output:123
编辑于 2017-03-09 19:27:23 回复(0)
进行一个类的初始化时,如果用其他实例初始化(边定义边赋值),调用复制构造函数,如:A b=a; 对已经定义好的实例只是进行赋值,调用的是赋值运算符。如:A a;A b;b=a;
编辑于 2015-10-21 10:24:02 回复(0)
定义时赋值调用拷贝构造函数
发表于 2017-07-21 08:00:27 回复(0)
A a;调用无参构造函数所以为1,A b=a;是一个旧的对象构造了一个新的对象,只有一个引用型参数(对象本身)所以调用的是复制构造或称为拷贝构造。所以为12.
而如果是A a;A b;b=a;这是旧的对象给另一个旧的对象赋值,因此调用的是赋值构造,并且由于拷贝构造是创造一个新的对象就会调用一次,因而如果是这样的话则为113;
编辑于 2019-08-21 21:04:18 回复(0)
初始化的重载符号不用
发表于 2018-07-10 10:42:35 回复(0)
选A如果是 A a; A b; a = b;就该选B了
发表于 2017-02-07 08:44:05 回复(1)
为什么不是重载运算符?谁能说下
发表于 2018-01-08 22:28:13 回复(1)
笔记:调用拷贝构造的情况 1.用一个对象去初始化另外一个对象 2.对象以值传递的方式作为函数的参数传入 3.对象以值传递的方式作为函数的返回值传出
发表于 2017-08-02 10:03:47 回复(1)
在变量b被初始化时,使用的是复制构造函数,而不是赋值运算符。这是因为,变量b是通过使用a来初始化的,而不是通过赋值运算符将a的值传递给b。因此,当变量b被初始化时,会调用A类的复制构造函数,将a的值复制给b,而不是调用A类的赋值运算符。 需要注意的是,当对象被初始化时,必须调用构造函数;而当已有对象需要改变其值时,才会调用赋值运算符。在这个例子中,变量b是一个新的对象,而不是已有的对象需要改变值,因此需要调用复制构造函数来完成初始化,而不是赋值运算符来改变其值。 总之,这段程序中并没有调用赋值运算符,而是调用了复制构造函数来完成变量初始化的操作。 希望对你们有用(◦˙▽˙◦)
发表于 2023-04-12 14:51:59 回复(0)
用对象a初始化对象b,调用拷贝构造函数。
发表于 2019-08-17 18:00:56 回复(0)
在这个例子中,A b=a;等价于 A b(a);第三个重载赋值函数并没有被调用。
发表于 2018-09-19 21:35:26 回复(0)
两个对象都存在时才能赋值构造
发表于 2018-08-14 14:14:58 回复(0)
定义过程编译器做了优化处理,也是为了尽量节省内存原则
发表于 2017-11-02 22:32:14 回复(0)
扩充一下,如果赋值操作写成:
A operator=(const A a)
{       
printf("3");
return *this;   }  
main函数改为:
int main()
{
A a;
A b ;     
b = a;
} 
其他不变,输出为:11232


编辑于 2015-10-10 16:39:11 回复(3)