c/c++ 拷贝控制 构造函数的问题
拷贝控制 构造函数的问题
问题1:下面①处的代码注释掉后,就编译不过,为什么???
问题2:但是把②处的也注释掉后,编译就过了,为什么???
编译错误:
001.cpp: In copy constructor ‘test::test(const test&)’:
001.cpp:21:22: error: no matching function for call to ‘Int::Int()’
test(const test& t){
^
001.cpp:11:3: note: candidate: Int::Int(const Int&)
Int(const Int& tmp){
^~~
001.cpp:11:3: note: candidate expects 1 argument, 0 provided
001.cpp:8:3: note: candidate: Int::Int(int)
Int(int i):mi(i){
^~~
001.cpp:8:3: note: candidate expects 1 argument, 0 provided
#include <iostream>
class Int{
private:
int mi;
public:
//Int(){}---->①
Int(int i):mi(i){//---->④
std::cout << "c" << std::endl;
}
Int(const Int& tmp){
mi = tmp.mi;
}
~Int(){}
};
class test{
Int data;//---->③
public:
test(Int d) : data(d){}
test(const test& t){//---->②
//data = t.data;//---->②
}//---->②
~test(){}
Int getvalue(){
return data;
}
//重载方法
Int getvalue() const {
return data;
}
};
int main(){
//Int d1(10);
//test t1(10);
//const test t2(12);
//Int a1 = t2.getvalue();
//int& b1 = t2.getvalue();
//const Int& c1 = t2.getvalue();
}
问题1的答案:class test里有个自定义成员data,由于class Int,提供了有参数的构造函数,导致了编译器就不会自动生成默认构造函数(无参数的构造函数),而且在class test里也没有给data赋初始值,没有给初始值,当编译到test的拷贝构造函数时,发现data没有初始值,所以编译器就去找Int的默认的构造函数(无参数的构造函数),但是没找到,所以就提示找不到‘Int::Int()’。
问题2的答案:把test的拷贝构造注释掉了后,就只剩一个带参数的test类的构造函数,导致了编译器就不会自动生成默认构造函数(无参数的构造函数),所以,只能用带参数的构造函数来初始化test,这个构造函数里初始化了data,所以编译就正常通过了。
修改办法:
1,在③处给初始值。例如:Int data = 10;
2,在④处,修改为:int(int i = 0):mi(i){
3,把类Int的所有构造函数和拷贝构造函数注释掉,这样一来,编译器就和自动合成这些构造函数。
c/c++ 拷贝控制 构造函数的问题的更多相关文章
- 【C++ Primer | 15】构造函数与拷贝控制
合成拷贝控制与继承 #include <iostream> using namespace std; class Base { public: Base() { cout << ...
- OOP3(继承中的类作用域/构造函数与拷贝控制/继承与容器)
当存在继承关系时,派生类的作用域嵌套在其基类的作用域之内.如果一个名字在派生类的作用域内无法正确解析,则编译器将继续在外层的基类作用域中寻找该名字的定义 在编译时进行名字查找: 一个对象.引用或指针的 ...
- C++ Primer : 第十三章 : 拷贝控制之对象移动
右值引用 所谓的右值引用就是必须将引用绑定到右值的引用,我们通过&&来绑定到右值而不是&, 右值引用只能绑定到即将销毁的对象.右值引用也是引用,因此右值引用也只不过是对象的别名 ...
- C++ Primer : 第十三章 : 拷贝控制之拷贝控制和资源管理
定义行为像值的类 行为像值的类,例如标准库容器和std::string这样的类一样,类似这样的类我们可以简单的实现一个这样的类HasPtr. 在实现之前,我们需要: 定义一个拷贝构造函数,完成stri ...
- C++的那些事:类的拷贝控制
1,什么是类的拷贝控制 当我们定义一个类的时候,为了让我们定义的类类型像内置类型(char,int,double等)一样好用,我们通常需要考下面几件事: Q1:用这个类的对象去初始化另一个同类型的对象 ...
- C++ Primer : 第十三章 : 拷贝控制之拷贝、赋值与销毁
拷贝构造函数 一个构造函数的第一个参数是自身类类型的引用,额外的参数(如果有)都有默认值,那么这个构造函数是拷贝构造函数.拷贝构造函数的第一个参数必须是一个引用类型. 合成的拷贝构造函数 在我们没 ...
- Chapter13:拷贝控制
拷贝控制操作:拷贝构造函数.拷贝赋值运算符.移动构造函数.移动赋值运算符.析构函数. 实现拷贝控制操作的最困难的地方是首先认识到什么时候需要定义这些操作. 拷贝构造函数: 如果一个构造函数的第一个参数 ...
- C++ 拷贝控制和资源管理,智能指针的简单实现
C++ 关于拷贝控制和资源管理部分的笔记,并且介绍了部分C++ 智能指针的概念,然后实现了一个基于引用计数的智能指针.关于C++智能指针部分,后面会有专门的研究. 通常,管理类外资源的类必须定义拷贝控 ...
- c/c++ 拷贝控制 右值与const引用
拷贝控制 右值与const引用 背景:当一个函数的返回值是自定义类型时,调用侧用什么类型接收?? 1,如果自定义类型的拷贝构造函数的参数用const修饰了:可以用下面的方式接收. Test t2 = ...
随机推荐
- 注解式controller开发,action找不到controller???
Spring这一列列的 , 配置是真的多,学完我都忘啦 那个配置是干什么的了. 这里我遇到的问题是 我前台 使用action请求controller中的方法时,却找不到 报错404. 首先你路径 ...
- 第五周 IP通信基础回顾
广播请求,单播响应,ARP IPV4,IP地址32位二进制代码分为8个位一组 路由器每一个接口都是一个网段 ,网段与网段区分看网络地址 同一段链路是同网段 直接广播:主机号全为1 受限广播:全为1 特 ...
- nfs服务启动失败:Failed to start NFS status monitor for NFSv2/3 locking..
今天碰到个问题,服务器重启后,nfs服务就启动不了了,关闭都关不了.查看系统日志报下面的错: Aug 10 17:08:53 prod-r3-slt-s-01 systemd: Started Pre ...
- BBS论坛(二十六)
26.发布帖子前台代码逻辑完成 (1)front/hooks.py from .views import bp from flask import session,g from .models imp ...
- BBS论坛(四)
4.1.cms登录页面csrf保护 (1)Perfect_bbs.py from flask_wtf import CSRFProtect CSRFProtect(app) 添加csrf保护后,现在再 ...
- Django2.0版本 path与Django1.x版本url正则匹配问题
Django1.x版本url正则匹配如下: Django2.0版本正则匹配则要导入re_path模块如下:
- .NET Core玩转机器学习
最近在搞机器学习,目前国内没有什么关于ML.NET的教程,官方都是一大堆英文,经过了我的努力,找到了Relax Development大哥的博客,有关于ML.NET的内容 原文地址:https://w ...
- C#版(击败100.00%的提交) - Leetcode 744. 寻找比目标字母大的最小字母 - 题解
C#版 - Leetcode 744. 寻找比目标字母大的最小字母 - 题解 744.Find Smallest Letter Greater Than Target 在线提交: https://le ...
- 五一之起一台服务器玩玩-u盘安装centos
之前淘宝买的300块钱笔记本,就是拿来练手的,但是命令基本都知道了,不来练手,学习下去就没有动力了啊. 对于新的笔记本,我们怎么安装系统呢?能去官网就去官网,你绝对没有体验过睡一晚早上起来服务器就被黑 ...
- C++STL模板库序列容器之vector
目录 STL之Vecter 一丶STL简介 二丶Vector用法 1.vector容器的使用 2.vector迭代器. 3.vector中的方法. 三丶常用算法 1.常见算法中的算法方法. 2.sor ...