c++11中 构造函数 与 复制构造函数和赋值操作符的关系 ??? 5C

各位好,以下代码:

#include<iostream>
using namespace std;

class B {
public:
  B() {}
  virtual ~B() {}
  virtual void paly() = 0;
private:
 B(const B&) = delete;
 B& operator=(const B&) = delete;
};

class D: public B {
public: 
 explicit D(int a) {}
 void paly() {cout << "qwertyuiop" <<endl;}
};

int main() {
int a = 0;
B* bp = new D(a);

bp->paly();
delete bp;
return 0;
}

使用 g++ -Wall -std=c++11 -o main a.cc 编译没有问题;
但是注释掉B() {} 构造函数后出现错误:代码如下:

#include<iostream>
using namespace std;

class B {
public:
  ///////B() {}
  virtual ~B() {}
  virtual void paly() = 0;
private:
 B(const B&) = delete;
 B& operator=(const B&) = delete;
};

class D: public B {
public: 
 explicit D(int a) {}
 void paly() {cout << "qwertyuiop" <<endl;}
};

int main() {
int a = 0;
B* bp = new D(a);

bp->paly();
delete bp;
return 0;
}

g++报错如下:

a.cc: In constructor ‘D::D(int)’:
a.cc:16:20: error: no matching function for call to ‘B::B()’
  explicit D(int a) {}
                    ^
a.cc:10:2: note: candidate: B::B(const B&) <deleted>
  B(const B&) = delete;
  ^
a.cc:10:2: note:   candidate expects 1 argument, 0 provided

如果 把delete取消,代码如下: 又可以成功编译。

#include<iostream>
using namespace std;

class B {
public:
  ///////B() {}
  virtual ~B() {}
  virtual void paly() = 0;
private:
 ////B(const B&) = delete;
 ////B& operator=(const B&) = delete;
};

class D: public B {
public: 
 explicit D(int a) {}
 void paly() {cout << "qwertyuiop" <<endl;}
};

int main() {
int a = 0;
B* bp = new D(a);

bp->paly();
delete bp;
return 0;
}

所以我想问, 对于复制构造和赋值操作符的禁用 是会 影响 默认函数的合成吗?
c++11里面有相关的描述吗???
谢谢。

c++

2个回答

你这好像不是你说的原因,这是c++的对象特性,当你需要使用c++的对象,你必须要实例化一个对象,你上面最后一步可运行是因为你类d只是继承了b的方法.而你第一个问题出现的原因也算是实例化的问题,你创建一个类对象时,你就需要去实例化类里的变量和方法,而你构造函数都没,怎么去构造呢

peng_code
peng_code 回复cool-warm-self-know: https://blog.csdn.net/panda1234lee/article/details/52459760
7 个月之前 回复
peng_code
peng_code 回复cool-warm-self-know: “如果类包含内置或复合类型的成员,则不会依赖于合成的默认构造函数”,言下之意就是合成的默认构造函数并不会初始化内置或复合类型的成员。
7 个月之前 回复
penglijiangge
cool-warm-self-know 您好,因为注释掉B(){} 导致编译报错,所以我觉得 编译器 没有为 B合成一个默认构造函数。可是想不通为什么会出现这种情况。
8 个月之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问