文档章节

C++ explicit和mutable关键字

无奈的初弦
 无奈的初弦
发布于 2014/05/12 14:27
字数 654
阅读 73
收藏 0

隐式转换

先看下面的代码,尤其是构造函数的部分

#include <iostream>
using namespace std;
//隐式转换
/*
在类中,隐式转换能够被以下三种成员函数控制:
1.一个参数的构造函数:这个能使一个特定的类型初始化这个类
2.重载赋值操作符:能是一个类型通过赋值来隐式转化
3.类型转换运算符:允许隐式转换为一个类型,
  类型转换运算符使用一个特定的语法,它使用operator关键字后面的目标类型和一对空括号,
  注意,返回类型是目的地型,因此在operator关键字之前没有标明。)
*/
class A {};
class B
{
public:
    //explicit B(const A &x){} //带有explicit的构造函数
    B(const A &x){}//构造函数
    //重载赋值运算符
    B& operator = (const A &x) {return *this;}
    //类型转化运算符,operator关键后面是返回类型,前面没有任何东西
    operator A() {return A();}
};
void fn (B x) {}
int main()
{
    A foo;
    B bar = foo;//这种是调用的构造函数,这个地方正确
    bar = foo;//这个是调用的重载赋值运算符
    foo = bar;//这个是调用的是赋值转换运算符

  //  fn (foo);  // 如果有explicit关键字,这中调用不合法
    return 0;
}

加入explicit之后

把构造函数改成

    //构造函数
    explicit B(const A &x){}

再看

B bar = foo;//这时这个地方已经出现问题,从A无法转化到B

因为关键字explicit阻止了隐式类型转换

类型转换操作符也可以加入explicit关键字阻止隐式类型转换.

explicit operator A() {return A();}

这样声明类型转换操作符

会导致

foo = bar;//这个是调用的是赋值转换运算符

代码出现问题.

mutable关键字

这个关键字更比较有意思了.

我们大多数写函数的时候如果要防止一个函数对成员变量进行改变可以加上const修饰

class A
{
public:
    A(){}
    A(int index):index(index){}
public:
    int GetIndex() const;
    mutable int index;
};
int A::GetIndex() const
{
    index ++;//如果没有mutable关键字这样是错误的,因为const函数,加上mutable关键字就不同了
}

这样就可以在const函数中对成员变量进行随意的操作了

© 著作权归作者所有

无奈的初弦
粉丝 2
博文 25
码字总数 8623
作品 0
海淀
程序员
私信 提问
ANSI C++特征总结

随着C++的普及,标准的指定成了C++发展的必然趋势。而制订此一标准的工作是由ANSI (American National Standards Institute,美国标准学会)与ISO (International Standardization Organiz...

NILYANG
2009/06/01
114
0
C++ explicit关键字详解

首先, C++中的explicit关键字只能用于修饰只有一个参数的类构造函数, 它的作用是表明该构造函数是显示的, 而非隐式的, 跟它相对应的另一个关键字是implicit, 意思是隐藏的,类构造函数默认情况...

天王盖地虎626
07/02
5
0
C++十个最具人气关键字

C++是一种特性丰富的编程语言,不过,其众多的特性中广为人知且被广泛使用的只是一小部分。不久前的一个周末,码农Tactoth用一段Python程序(或者说是寂寞)统计了大量C++代码中各个关键字的出...

红薯
2009/09/25
782
0
[C++11]Lambda表达式的使用

C++11引入了Lambda表达式。Lambda表达式的引入,方便了简短函数的定义,为常用的一次性函数的定义和使用提供了很大的便利。 Lambda表达式实际上是一种匿名函数定义,常用来定义简单和不重复使...

徐涛
2014/06/27
154
2
VS2013中的C++11新特性

介绍 Visual C++ 2013 Preview 在6月发布了,C++开发者又找到一个编译器可以更好的支持ISO C++ 11 的特性了.本文介绍了这些新的特性并附有代码实例. 你想动手尝试编译文中的这些代码话,需要去...

疙瘩
2013/07/23
38.6K
42

没有更多内容

加载失败,请刷新页面

加载更多

刚哥谈架构 (二) 我眼中的架构师

之前在公司,有小伙伴在向别人介绍我的时候,经常会有人这么说:“刚哥是我们的architcture”,如果来人是老外,心中一定是一惊,心中暗叹,“这位匪首看上去貌不惊人,难道已经做到了架构和...

naughty
37分钟前
3
0
OSChina 周日乱弹 —— 别问,问就是没空

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @tom_tdhzz :#今日歌曲推荐# 分享容祖儿/彭羚的单曲《心淡》: 《心淡》- 容祖儿/彭羚 手机党少年们想听歌,请使劲儿戳(这里) @wqp0010 :周...

小小编辑
今天
93
3
golang微服务框架go-micro 入门笔记2.1 micro工具之micro api

micro api micro 功能非常强大,本文将详细阐述micro api 命令行的功能 重要的事情说3次 本文全部代码https://idea.techidea8.com/open/idea.shtml?id=6 本文全部代码https://idea.techidea8....

非正式解决方案
今天
5
0
Spring Context 你真的懂了吗

今天介绍一下大家常见的一个单词 context 应该怎么去理解,正确的理解它有助于我们学习 spring 以及计算机系统中的其他知识。 1. context 是什么 我们经常在编程中见到 context 这个单词,当...

Java知其所以然
昨天
5
0
Spring Boot + Mybatis-Plus 集成与使用(二)

前言: 本章节介绍MyBatis-Puls的CRUD使用。在开始之前,先简单讲解下上章节关于Spring Boot是如何自动配置MyBatis-Plus。 一、自动配置 当Spring Boot应用从主方法main()启动后,首先加载S...

伴学编程
昨天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部