关于C++非常难搞的简单有关问题
关于C++非常难搞的简单问题
------解决思路----------------------
当我们在程序中声明一个对象时,编译器为调用构造函数(如果有的话),而这个调用将通常是外部的,也就是说它不属于class对象本身的调用,假如构造函数是私有的,由于在class外部不允许访问私有成员,所以这将导致编译出错
这是我网上找的.
你这是重载构造函数, 如果外部调用的是无法访问的
------解决思路----------------------
void foo(E e)
{
}
这不是在调用拷贝构造函数吗?你调用了foo,该函数采用了“传值”方式,既然是传值,那就发生了对象的拷贝啊。
------解决思路----------------------
你是这函数参数的“传值”和“传地址”没有掌握
------解决思路----------------------
上面讲错了,刚才问主程了.
原因是调用foo( E() ) 等价于 E e = E()
E()不会报错 报错就在 e = E(); 调用的是拷贝构造函数
------解决思路----------------------
楼上说的没错,e=E()调用拷贝函数了,私有了就报错了
------解决思路----------------------
也就是你的foo()函数中有E e=E()操作,这个操作调用了E类的私有成员,外部函数调用私有成员就报错了
------解决思路----------------------
情况 2
需要拷贝!
检测一下拷贝构造能不能用。私有?拒绝。编译错误。。。。
情况 1
需要拷贝!
检测一下拷贝构造能不能用,能用?好!下一步
呃,这里的拷贝没必要存在啊,好!删掉。
#include <iostream>
using namespace std;
class E {
public:
E(const E&) {
cout << "copy ctr" << endl;
}
public:
E() {
cout << "ctr" << endl;
}
~E() {
}
};
void foo(E e) {
}
int main() {
foo(E());
return 0;
}
// 这段代码打印ctr,也就是说没有调用E::E(const E&)
#include <iostream>
using namespace std;
class E {
//public:
E(const E&) {
cout << "copy ctr" << endl;
}
public:
E() {
cout << "ctr" << endl;
}
~E() {
}
};
void foo(E e) {
}
int main() {
foo(E());
return 0;
}
// 这段代码编译失败,既然上面的代码说明没有调用E::E(const E&),那么为什么不能是private
------解决思路----------------------
当我们在程序中声明一个对象时,编译器为调用构造函数(如果有的话),而这个调用将通常是外部的,也就是说它不属于class对象本身的调用,假如构造函数是私有的,由于在class外部不允许访问私有成员,所以这将导致编译出错
这是我网上找的.
你这是重载构造函数, 如果外部调用的是无法访问的
------解决思路----------------------
void foo(E e)
{
}
这不是在调用拷贝构造函数吗?你调用了foo,该函数采用了“传值”方式,既然是传值,那就发生了对象的拷贝啊。
------解决思路----------------------
你是这函数参数的“传值”和“传地址”没有掌握
------解决思路----------------------
上面讲错了,刚才问主程了.
原因是调用foo( E() ) 等价于 E e = E()
E()不会报错 报错就在 e = E(); 调用的是拷贝构造函数
------解决思路----------------------
楼上说的没错,e=E()调用拷贝函数了,私有了就报错了
------解决思路----------------------
也就是你的foo()函数中有E e=E()操作,这个操作调用了E类的私有成员,外部函数调用私有成员就报错了
------解决思路----------------------
情况 2
需要拷贝!
检测一下拷贝构造能不能用。私有?拒绝。编译错误。。。。
情况 1
需要拷贝!
检测一下拷贝构造能不能用,能用?好!下一步
呃,这里的拷贝没必要存在啊,好!删掉。