http://www.cnblogs.com/chio/archive/2007/09/17/895263.html

c++中的explicit关键字用来修饰类的构造函数,表明该构造函数是显式(调用)的,既然有"显式"那么必然就有"隐式",那么什么是显示而什么又是隐式的呢?

如果c++类的构造函数有一个参数,那么在编译的时候就会有一个缺省的转换操作:将该构造函数参数对应数据类型的数据转换为该类对象,如下面所示:

class MyClass
{
public:
MyClass(int num){};
}; MyClass obj = ;//10被隐式调用构造函数转换为MyClass类型对象

在上面的代码中编译器自动将整型转换为MyClass类对象,实际上等同于下面的操作:
MyClass temp(10);
MyClass obj = temp;
上面的所有的操作即是所谓的"隐式转换"。

如果要避免这种自动转换的功能,我们该怎么做呢?这就是关键字explicit的作用了,将类的构造函数声明为"显式",也就是在声明构造函数的时候前面添加上explicit即可,这样就可以防止这种自动的转换操作,如果我们修改上面的MyClass类的构造函数为显式的,那么下面的代码就不能够编译通过了,如下所示:

class MyClass
{
public:
explicit MyClass(int num){};
}; MyClass obj = ;//出错

class Rational
{
public:
Rational(int numerator = , int denominator = )
{
this->numerator = numerator;
this->denominator = denominator;
}
~Rational(){}
int get_numerator()
{
return numerator;
}
int get_denominator()
{
return denominator;
} const Rational operator*(const Rational &rhs) const; private:
int numerator;
int denominator;
}; const Rational Rational::operator*(const Rational &rhs) const
{
return Rational(numerator * rhs.numerator, denominator*rhs.denominator);
} int main()
{
Rational a(, );
//Rational b = 2 * a;//编译出错,相当于2.operator*(a),而2不是Rational类型
Rational b = a * ;//2会被隐式类型转换为Rational对象
cout << b.get_numerator() << " " << b.get_denominator() << endl; system("pause");
return ;
}

上述有理数运算不满足交换律,所以需要改进

class Rational
{
public:
Rational(int numerator = , int denominator = )
{
this->numerator = numerator;
this->denominator = denominator;
}
~Rational(){}
int get_numerator() const
{
return numerator;
}
int get_denominator() const
{
return denominator;
} private:
int numerator;
int denominator;
}; const Rational operator*(const Rational& lhs,const Rational &rhs)
{
return Rational(lhs.get_numerator() * rhs.get_numerator(), lhs.get_denominator()*rhs.get_denominator());
} int main()
{
Rational a(, );
//2会被隐式类型转换为Rational对象
Rational b = * a;
//Rational b = a * 2;
cout << b.get_numerator() << " " << b.get_denominator() << endl; system("pause");
return ;
}

总结:如果你需要为某个函数的所有参数进行类型转换,那么这个函数必须是个non-member(effective c++ 条款24)

绝不要返回指针或引用指向一个local stack对象,因为local stack对象当退出函数时就被析构了,也就是说指针或者引用指向未知的内存;不要返回引用指向一个heap-allocated对象,会导致内存泄漏;不要返回指针或引用指向一个local static对象,因为有可能同时需要多个这样的对象,此时这些对象其实都是同一个对象。所以一个必须返回新对象的函数的正确写法是:让那个函数返回一个新对象,不用担心拷贝构造函数导致的性能损失。例子可见上面的operator*的写法(effective c++ 条款21)

【c++】【转】c++中的explicit关键字的更多相关文章

  1. C++中的explicit关键字的用法

    一.explicit作用: 在C++中,explicit关键字用来修饰类的构造函数,被修饰的构造函数的类,不能发生相应的隐式类型转换,只能以显示的方式进行类型转换. 二.explicit使用注意事项: ...

  2. C++中的explicit关键字

    http://www.cnblogs.com/winnersun/archive/2011/07/16/2108440.html 上面链接中的博主写的很好,我也不多说了.举得例子也很好,应该也是看了E ...

  3. C++中的explicit关键字 - 抑制隐式转换(转)

    在C++程序中很少有人去使用 explicit 关键字,不可否认,在平时的实践中确实很少能用的上.再说C++的功能强大,往往一个问题可以利用好几种C++特性去解决.但稍微留心一下就会发现现有的MFC库 ...

  4. C++中的explicit关键字(转)

    按默认规定,只用传一个参数的构造函数也定义了一个隐式转换.举个例子: #pragma once class CExample { public: CExample(void); CExample(); ...

  5. C++ explicit关键字详解

    本文系转载,原文链接:http://www.cnblogs.com/ymy124/p/3632634.html 首先, C++中的explicit关键字只能用于修饰只有一个参数的类构造函数, 它的作用 ...

  6. explicit关键字

    C++中,explicit关键字用来修饰类只有一个参数的构造函数,被修饰的构造函数的类,不能发生相应的隐式类型转换,只能以显示的方式进行类型转换. explicit使用注意事项: explicit 关 ...

  7. C++explicit关键字

    在C++中,explicit关键字用来修饰类的构造函数,被修饰的构造函数的类,不能发生相应的隐式类型转换,只能以显示的方式进行类型转换. explicit使用注意事项: *     explicit  ...

  8. C++ explicit关键字详解(转载)

    转载:https://www.cnblogs.com/ymy124/p/3632634.html 首先, C++中的explicit关键字只能用于修饰只有一个参数的类构造函数, 它的作用是表明该构造函 ...

  9. C++ explicit 关键字

    原文转自:http://www.cnblogs.com/ymy124/p/3632634.html 首先, C++中的explicit关键字只能用于修饰只有一个参数的类构造函数, 它的作用是表明该构造 ...

随机推荐

  1. java-IO操作性能对比

    在软件系统中,IO速度比内存速度慢,IO读写在很多情况下会是系统的瓶颈. 在java标准IO操作中,InputStream和OutputStream提供基于流的IO操作,以字节为处理单位:Reader ...

  2. 【译】x86程序员手册36-9.9异常汇总

    9.9 Exception Summary 异常汇总 Table 9-6 summarizes the exceptions recognized by the 386. Table 9-6. Exc ...

  3. mac webstrom 安装less

    1.检验电脑是否安装less lessc -v 2.如果没有执行全局安装命令 npm install -g less 3.webstrom -> Preferencs-> File Wat ...

  4. PHP网络协议相关考点

    HTTP状态码 HTTP状态码(HTTP Status Code)是用以表示网页服务器HTTP响应状态的3位数字代码. HTTP状态码主要有5种,代表5种不同类型的响应: 1xx:信息性状态码,代表接 ...

  5. 习水医院12C RAC 数据库安装文档

        环境介绍 OS: Oracle Enterprise Linux 6.4 (For RAC Nodes) DB: GI and Database 12.1.0.2 所需介质 p17694377 ...

  6. ALTER SCHEMA - 修改一个模式的定义

    SYNOPSIS ALTER SCHEMA name RENAME TO newname DESCRIPTION 描述 ALTER SCHEMA 修改一个模式的定义. 现在它唯一的功能就是重命名模式. ...

  7. webpack的详细介绍和使用

    // 一个常见的`webpack`配置文件 const webpack = require('webpack'); const HtmlWebpackPlugin = require('html-we ...

  8. vsphere中的linux虚拟机安装vmware-tools

    先在vcenter中选中虚拟机点击安装这个工具,如图 然后这台linux虚拟机的控制台操作,挂载先建立挂载目录 cd /mnt #在挂载建一个用来挂载的文件. mkdir cdrom 使用mount命 ...

  9. [SQL]数据分析SQL笔试题

    SQL笔试题 1.请简单写出left join和join的用法区别(可举例说明): 2.求出订单表(order表)中每个客户(custid)的最近一次购买日期(要求:按custid降序排列,trans ...

  10. Ubuntu-11.10中 vim和Gedit打开html文件中文乱码问题

    解决vim中文乱码方法:     打开/etc/vim/vimrc     添加代码:     set fileencodings=utf-8,gb2312,gbk,gb18030     set t ...