类中有引用需要注意——非静态的引用成员错误提示,不能使用默认的赋值运算符

2023-11-14

  我们知道,当我们我们没有定义赋值操作符时,编译器会生成一个默认的赋值操作符执行浅拷贝,就像默认构造函数一样是编译器默认生成的。而如果勒种有引用就需要注意一个大大的误区。我们知道引用在定义的时候就需要初始化,指定这个引用变量是哪个变量的别名,否则就会报错。当一个类中使用了引用但没有定义赋值操作符,会导致什么问题呢?


#include<iostream>  
using namespace std;  

class Test  
{  
    int x;  
    int &ref;  
public:  
    Test (int i):x(i), ref(x) {} //有参构造,引用看似是赋初始值了 
    void print() { cout << ref; }  
    void setX(int i) { x = i; }     
};  

int main()  
{  
    Test t1(10);  
    Test t2(20);  
    t2 = t1;  
    t1.setX(40);  
    t2.print();  
    return 0;  
}  

  上面的程序会编译报错:

Compiler Error: non-static reference member 'int& Test::ref', can't use default assignment operator

  意思就是非静态的引用成员,’int& Test::ref’,不能使用默认的赋值运算符。
  那么这里为什么不能使用默认的赋值运算符呢?其实C++中是有规定的,在下面的这些情况下,编译器不会自动创建默认赋值操作符:
  1. 类中包含const或volatile类型的非静态数据成员
  2. 类中包含一个非静态的数据成员,并且其类型是不能赋值的(例如引用)。
  3. 被继承的基类中不能使用赋值操作符(例如基类中包含引用类型的成员)。
  只要上面的某个条件成立,则用户必须自定义赋值操作符。所以我们需要修改上面的程序,增加一个赋值运算符的重载就可以了。

#include<iostream>  
using namespace std;  

class Test  
{  
    int x;  
    int &ref;  
public:  
    Test (int i):x(i), ref(x) {}  //有了赋值运算符才可以直接赋值
    void print() { cout << ref; }  
    void setX(int i) { x = i; }     
    Test &operator = (const Test &t) { x = t.x; return *this; }  // 重载赋值运算符
};  

int main()  
{  
    Test t1(10);  
    Test t2(20);  
    t2 = t1;  
    t1.setX(40);  
    t2.print();  
    return 0;  
} 

  输出: 10


  参考:
  http://blog.csdn.net/shltsh/article/details/46004143

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

类中有引用需要注意——非静态的引用成员错误提示,不能使用默认的赋值运算符 的相关文章

  • C/C++语言实现WiFi(socket)数据收发(客户端和服务端)

    目录 客户端 client 服务端 server C C 实现TCP通信 接收WIFI数据 编程环境 VC 6 0 手机端 使用WiFi调试助手 提示 整个过程在局域网中进行 很多编程语言都可以实现socket通信 本博客将通过C C 实现
  • 侯捷系列:c++面向对象高级编程(上)

    文章目录 基于对象的程序设计 不带有指针成员变量的类 以复数类 Complex 为例 头文件的结构 访问级别 函数设计 内联函数 构造函数 常量成员函数 参数的值传递和引用传递 返回值的值传递和引用传递 友元 操作符重载 在类内声明 pub
  • 调用拷贝构造函数的几种情况(附面试题)

    1 深拷贝和浅拷贝 拷贝构造函数的使用 有时候需要自己定义拷贝构造函数 以避免浅拷贝问题 在什么情况下需要用户自己定义拷贝构造函数 一般情况下 当类中成员有指针变量 类中有动态内存分配时常常需要用户自己定义拷贝构造函数 在什么情况下系统会调
  • 多线程系列之——事件内核对象

    所有内核对象里面事件内核对象是最简单的一个 它包括一个使用计数 还有两个布尔值 一个布尔值用来表示事件是手动重置事件还是自动重置事件 另一个布尔值表示当前是否处于触发状态 当一个手动重置事件被触发的时候 所有等待该事件的线程都能变成调度状态
  • 编写递归算法,计算二叉树叶子结点的数目。

    编写递归算法 计算二叉树叶子结点的数目 编写递归算法 计算二叉树叶子结点的数目 include stdio h 包含 getchar scanf printf include malloc h malloc 动态申请空间 函数 二叉树 结点
  • JNA模拟复杂的C类型——Java映射char*、int*、float*、double*

    文章目录 引言 Java Native Type Conversions Java和C基本类型指针对应关系 Pointer的具体用法 引言 最近项目在用Java调用C写的一些三方库 没办法直接调 用Java封装一下C的接口 这就少不了要用到
  • 互联网创业盈利模式指南

    看了很多创业的case 都有点下笔千言 离题万里的 情况 就是很多case都很精彩 但是公司 的价值最终是落实到 给创业者和投资人的回报的 因此 所有的case 最终都是 落实到盈利 模式上 一位投资人士说的很明确 中国的盈利模式很简单 就
  • 经典面试题之new和malloc的区别

    new和malloc的区别是C C 一道经典的面试题 我也遇到过几次 回答的都不是很好 今天特意整理了一下 0 属性 new delete是C 关键字 需要编译器支持 malloc free是库函数 需要头文件支持 1 参数 使用new操作
  • Lua和C++交互总结(很详细)

    出处 http blog csdn net shun fzll article details 39120965 一 lua堆栈 要理解lua和c 交互 首先要理解lua堆栈 简单来说 Lua和C c 语言通信的主要方法是一个无处不在的虚拟
  • 【干货】Chrome插件(扩展)开发全攻略(不点进来看看你肯定后悔)<转>

    干货 Chrome插件 扩展 开发全攻略 不点进来看看你肯定后悔 写在前面 我花了将近一个多月的时间断断续续写下这篇博文 并精心写下完整demo 写博客的辛苦大家懂的 所以转载务必保留出处 本文所有涉及到的大部分代码均在这个demo里面 h
  • lua和测试(一)

    lua做为一门高级语言 在游戏产业运用到机会越来越多了 测试掌握几门脚本语言也有一定的重要性 以下对于lua组合输入做出一些引导 测试需要掌握的关于返回数值 主要用到布尔类 前言的指引 lua的语法比较简单和清晰 学过c语言的可以很好的掌握
  • 手把手教你如何写一个三子棋/N子棋的小游戏

    这里写目录标题 第一步 游戏进入界面 第二步 初始化棋盘 第三步 打印棋盘 第四步 玩家和电脑下棋 第五步 判断输赢 三子棋或者N子棋怎么写 让我们先来玩一把 再来看看怎么写 程序运行界面 1为玩游戏 2为清屏 0为退出游戏 我们选1 然后
  • C++学习笔记12:输入输出流实例整理(文本文件读写,二进制文件读写,一组数据的文件读写,随机访问文件实例

    这也太难记了555老阔疼 文件读写示例 include
  • 【C/C++】 - Linux下查找函数头文件 以及 man命令拓展

    背景 比如现在需要找C语言 sleep函数的头文件 使用man来查找 可以先man sleep 可以发现出来的默认是sleep 1 是一个User Commands 明显不是我们需要的 这里提示了 看sleep 3 那我们查看下sleep
  • stat 函数解析

    stat 函数的简单使用 stat 函数是用来获取文件的各种属性的一个linux下的常用API函数 函数原型为int stat const char path struct stat buf stat定义如下 struct stat dev
  • C++中的并发多线程网络通讯

    C 中的并发多线程网络通讯 一 引言 C 作为一种高效且功能强大的编程语言 为开发者提供了多种工具来处理多线程和网络通信 多线程编程允许多个任务同时执行 而网络通信则是现代应用程序的基石 本文将深入探讨如何使用C 实现并发多线程网络通信 并
  • C/C++编程:令人印象深刻的高级技巧案例

    C C 编程语言在软件开发领域有着悠久的历史 由于其高效 灵活和底层访问能力 至今仍然被广泛应用 本文将介绍一些在C C 编程中令人印象深刻的高级技巧 帮助读者提升编程水平 更加高效地使用这两种强大的编程语言 一 指针运算与内存管理 C C
  • C++ 字符串比较------strcmp函数和strncmp函数

    strcmp 函数原型 int strcmp const char str1 const char str2 功能 strcmp函数会按照字典顺序逐个比较两个字符串的字符 直到遇到不同的字符或者遇到字符串结束符 0 返回值 该函数返回值如下
  • 在 OS X 上的 virtualenv 中安装 scrapy 加密时发生错误 [关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 我正在安装 scrapypip in virtualenv on OS X 10 11 当它安装密码学时 它说 buil
  • 在 Solaris 上,使用 gcc 编译的库与使用 cc 生成的库的使用方式是否相同?

    我目前正在尝试编译 libxml2在 Solaris 上 当我运行源代码提供的 configure 脚本时 会自动使用 gcc 和 g 编译器 但是 我想使用 cc 和 CC 编译器 所以我跑 configure CC cc CXX CC

随机推荐

  • Python 代码规范

    前言 Python 学习之旅 先来看看 Python 的代码规范 让自己先有个意识 而且在往后的学习中慢慢养成习惯 目录 Python代码规范 一 简明概述 1 编码 如无特殊情况 文件一律使用 UTF 8 编码 如无特殊情况 文件头部必须
  • vs+qt程序添加cmd窗口

    概述 在项目开发过程中为方便查看一些调试信息 可以在运行时把命令行窗口同时显示出来 操作说明 项目右键选择属性 项目 属性 配置属性 链接器 系统 子系统 下拉选项中选择控制台 当不需要打 cmd 的时候设置子系统为窗口 SUBSYSTEM
  • EasyAR4.0稀疏空间地图室内导航

    现有的AR室内导航 一种方案是利用运动跟踪实现 但是偏移较大 比较靠谱或者说能满足商业使用的还是稀疏空间地图 ARCore管叫云锚点 实现效果如下 EasyAR稀疏云地图室内导航 制作思路其实很简单 先建立空间地图 然后利用平面图像追踪在空
  • PPTP 理解以及报文的分析

    首先 先来理解下什么是 PPTP PPTP将PPP Point to Point Protocol 帧封装进IP数据报中 通过IP网络如Internet或其他企业专用Intranet等发送 PPTP通过PPTP控制连接来创建 维护 终止一条
  • Dialog显示报错:Unable to add window -- token null is not valid; is your activity running?

    很平常的显示一个dialog 出现了如上报错 网上很多都说解决方案 但是没有说原理过程 简单的说下 在显示dialog时出现 是应用没有token所导致 而应用的token一般只有Activity拥有 所以需要用Activity作为cont
  • 【华为OD统一考试B卷

    在线OJ 已购买本专栏用户 请私信博主开通账号 在线刷题 运行出现 Runtime Error 0Aborted 请忽略 华为OD统一考试A卷 B卷 新题库说明 2023年5月份 华为官方已经将的 2022 0223Q 1 2 3 4 统一
  • C语言,使用函数封装,实现单词的逆置 “hello my student” 最终结果是”student my hello”

    实现单词的逆置 hello my student 最终结果是 student my hello 在该函数 void StrFun char str 循环字符串的 在该函数 void StrRev char str 主要是实现逆置的 incl
  • 超详细的Linux基础命令

    文章目录 前言 Linux目录结构 Linux命令通用格式 ls 命令 什么是工作目录 什么是 HOME 目录 目录切换相关命令 cd 命令 pwd 命令 特殊的路径符 创建目录 文件操作相关命令 touch 命令 cat 命令 more
  • java 日历_java的日历类(Calendar)详解

    老实说对于时间的处理我大部分都在用Calendar日历类解决 现在整理一下 方便以后开发查阅 java util 类 Calendar java lang Object 继承者 java util Calendar 所有已实现的接口 Ser
  • 火线 地线 零线 漫谈

    交流电不分正负 那为什么又要分火线和零线呢 零线的对地电位不一定为零 接近0 零线的最近接地点是在变电所或者供电的变压器处 交流电正半周火线电压为220v 零线接近0v 正 负半周时火线电压为负220v 零线电压接近0V 负 所以二相插座不
  • 此URL不支持Http方法GET 详情 请求行中接收的方法由源服务器知道,但目标资源不支持 解决方法之一

    因为response和request位置反了 这里位置反了所以doGet是灰的 换了个位置就好了 具体原因https www it1352 com 982509 html
  • 深入理解 Spring Boot Starters 原理(手写Spring boot Start)

    版权声明 本文为博主原创文章 遵循 CC 4 0 by sa 版权协议 转载请附上原文出处链接和本声明 本文链接 https blog csdn net zhaohong bo article details 89924053 一 Spri
  • 英特尔的集显和Nvidia的独显切换(切换之后永久有效)

    参考网址 https blog csdn net a850565178 article details 107979314 前提介绍 安装了nvidia驱动之后 有些电脑会发现setting的devices的Graphics显示的还是llv
  • SmartAndroid之SmartJump,告别onActivityResult

    SmartJump 需求 应用场景 实现思路 代码 调用示例 后记 需求 在跳转到另一个Activity后 通过回调直接获取到数据 应用场景 普通的activity跳转 回调获取数据可以使逻辑更清晰 第三方库中activity数据回调可以让
  • 实战案列:AntiDebug

    往期推荐 self debugging反调试 轮循检测技术 进程名称检测 Java层反调试 Anti Debug主要是通过各种函数去确定当前进程是否处于被调试的状态 一 IDA里面静态分析so文件 1 将文件拖入jdax gui中 进行静态
  • PLSQL字体设置常见问题

    PLSQL字体设置常见问题 从网络资源下载的PLSQL 字体默认的大小不太适合大屏幕的电脑 因为看起来字体很小 我们可打开PLSQL来设置字体的大小以及其他常规设置 一 字体太小 操作流程 菜单栏的Tools gt Preferences
  • 静态多态和动态多态

    多态 静态多态和动态多态 多态的实现主要分为静态多态和动态多态 静态多态主要是重载和模板 在编译的时候就已经确定 动态多态是用虚函数机制实现的 在运行期间动态绑定 举个例子 一个父类类型的指针指向一个子类对象时候 使用父类的指针去调用子类中
  • vue学习 十二 vue文件目录知晓 or 组件嵌套

    说明 我使用的是HBuilder 软件能用就可以了 查看顺序是 index html 入口文件 gt main js gt App vue 模板文件 可以看出能显示出欢迎页面 还有那个大V都在这里可以看到 gt components 自定义
  • Redis DEL删除命令是否会导致阻塞

    DEL命令是存在阻塞的可能性的 1 使用DEL命令删除key DEL keya keyb keyc 2 根据删除的key的数量和类型 操作的时间复杂度不同 删除N个key key中的数量为M则时间复杂度是O N M 删除一个字符串的key则
  • 类中有引用需要注意——非静态的引用成员错误提示,不能使用默认的赋值运算符

    我们知道 当我们我们没有定义赋值操作符时 编译器会生成一个默认的赋值操作符执行浅拷贝 就像默认构造函数一样是编译器默认生成的 而如果勒种有引用就需要注意一个大大的误区 我们知道引用在定义的时候就需要初始化 指定这个引用变量是哪个变量的别名