【c++】【转】c++中的explicit关键字
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关键字的更多相关文章
- C++中的explicit关键字的用法
一.explicit作用: 在C++中,explicit关键字用来修饰类的构造函数,被修饰的构造函数的类,不能发生相应的隐式类型转换,只能以显示的方式进行类型转换. 二.explicit使用注意事项: ...
- C++中的explicit关键字
http://www.cnblogs.com/winnersun/archive/2011/07/16/2108440.html 上面链接中的博主写的很好,我也不多说了.举得例子也很好,应该也是看了E ...
- C++中的explicit关键字 - 抑制隐式转换(转)
在C++程序中很少有人去使用 explicit 关键字,不可否认,在平时的实践中确实很少能用的上.再说C++的功能强大,往往一个问题可以利用好几种C++特性去解决.但稍微留心一下就会发现现有的MFC库 ...
- C++中的explicit关键字(转)
按默认规定,只用传一个参数的构造函数也定义了一个隐式转换.举个例子: #pragma once class CExample { public: CExample(void); CExample(); ...
- C++ explicit关键字详解
本文系转载,原文链接:http://www.cnblogs.com/ymy124/p/3632634.html 首先, C++中的explicit关键字只能用于修饰只有一个参数的类构造函数, 它的作用 ...
- explicit关键字
C++中,explicit关键字用来修饰类只有一个参数的构造函数,被修饰的构造函数的类,不能发生相应的隐式类型转换,只能以显示的方式进行类型转换. explicit使用注意事项: explicit 关 ...
- C++explicit关键字
在C++中,explicit关键字用来修饰类的构造函数,被修饰的构造函数的类,不能发生相应的隐式类型转换,只能以显示的方式进行类型转换. explicit使用注意事项: * explicit ...
- C++ explicit关键字详解(转载)
转载:https://www.cnblogs.com/ymy124/p/3632634.html 首先, C++中的explicit关键字只能用于修饰只有一个参数的类构造函数, 它的作用是表明该构造函 ...
- C++ explicit 关键字
原文转自:http://www.cnblogs.com/ymy124/p/3632634.html 首先, C++中的explicit关键字只能用于修饰只有一个参数的类构造函数, 它的作用是表明该构造 ...
随机推荐
- java-IO操作性能对比
在软件系统中,IO速度比内存速度慢,IO读写在很多情况下会是系统的瓶颈. 在java标准IO操作中,InputStream和OutputStream提供基于流的IO操作,以字节为处理单位:Reader ...
- 【译】x86程序员手册36-9.9异常汇总
9.9 Exception Summary 异常汇总 Table 9-6 summarizes the exceptions recognized by the 386. Table 9-6. Exc ...
- mac webstrom 安装less
1.检验电脑是否安装less lessc -v 2.如果没有执行全局安装命令 npm install -g less 3.webstrom -> Preferencs-> File Wat ...
- PHP网络协议相关考点
HTTP状态码 HTTP状态码(HTTP Status Code)是用以表示网页服务器HTTP响应状态的3位数字代码. HTTP状态码主要有5种,代表5种不同类型的响应: 1xx:信息性状态码,代表接 ...
- 习水医院12C RAC 数据库安装文档
环境介绍 OS: Oracle Enterprise Linux 6.4 (For RAC Nodes) DB: GI and Database 12.1.0.2 所需介质 p17694377 ...
- ALTER SCHEMA - 修改一个模式的定义
SYNOPSIS ALTER SCHEMA name RENAME TO newname DESCRIPTION 描述 ALTER SCHEMA 修改一个模式的定义. 现在它唯一的功能就是重命名模式. ...
- webpack的详细介绍和使用
// 一个常见的`webpack`配置文件 const webpack = require('webpack'); const HtmlWebpackPlugin = require('html-we ...
- vsphere中的linux虚拟机安装vmware-tools
先在vcenter中选中虚拟机点击安装这个工具,如图 然后这台linux虚拟机的控制台操作,挂载先建立挂载目录 cd /mnt #在挂载建一个用来挂载的文件. mkdir cdrom 使用mount命 ...
- [SQL]数据分析SQL笔试题
SQL笔试题 1.请简单写出left join和join的用法区别(可举例说明): 2.求出订单表(order表)中每个客户(custid)的最近一次购买日期(要求:按custid降序排列,trans ...
- Ubuntu-11.10中 vim和Gedit打开html文件中文乱码问题
解决vim中文乱码方法: 打开/etc/vim/vimrc 添加代码: set fileencodings=utf-8,gb2312,gbk,gb18030 set t ...