C++基础学习过程中出现的错误记录

1.在使用字符+个数初始化string时,写成了string(’ ‘,123),其实是string(123,’ ');和顺序容器的初始化时一样的,但是不知道为什么脑抽,一直写成反的,而且之前还编译通过了一次。。

2.在包含内置指针的类中,定义赋值运算符,忘记检测传入的对象是否是当前对象本身。以及忘记销毁内置指针当前指向的对象。

3.调用函数时,会在调用出生成一个临时的对象,这在C++ Primer中是写了的,但是我忘记了,结果看到运算结果百思不得其解怎么会多了一次构造。

下面的代码func中调用一次构造,然后在返回处生成一个临时对象初始化a,按道理来说生成临时对象会调用一次拷贝构造,然后改临时对象用于初始化a,会再调用一次拷贝构造,但是编译器似乎是做了优化,下面的调用只产生了一次构造和一次拷贝构造。

class A {
public:
	A() {
		cout << "A()" << endl;
	}
	A(const A&) {
		cout<<"const A&"<<endl;
	}
	A& operator =(const A& a) {
		cout << "operator=" << endl;
		return *this;
	}
};
A func() {
	A a;
	return a;
}

A a = func();

但是如果这么写,则会调用了一次构造,一次拷贝构造,一次赋值。

A a ;
a= func();

如果函数直接返回匿名对象:

A func() {
return A();
}

则下面的代码只发生了一次构造

A a = func();

而下面的代码则产生了一次构造,一次赋值

A a ;
a= func();

可以看到编译器做了优化,如果直接返回匿名对象,相当于将匿名对象直接放在调用处。

使得

A a = func();
等价于
A a = A()
A a();

A a ;
a= func();
等价于
a= A();
发布了54 篇原创文章 · 获赞 6 · 访问量 3325

猜你喜欢

转载自blog.csdn.net/zengqi12138/article/details/104271666
今日推荐