关键字explicit详解(一)
来源:互联网 发布:典型数据报表 编辑:程序博客网 时间:2024/05/06 12:24
《C++Primer》(英文版,第4版) p.461提到:
Aconstructor that can be called with a single argument defines an implicitconversion from the parameter type to the class type.
(如果一个类的构造函数只接收一个实参(argument),那么就定义了一个从形参(parameter)数据类型到类的类型的隐式转换。)
参考下面的例子,并且注意后面的注释。
#include <iostream>#include <string>using namespace std;class Book{public://如果一个类的构造函数只接收一个实参(argument),那么就定义一个从形参(parameter)数据类型到类的类型//的隐式转换。因此,在下面的构造函数,可隐式地将string类型转换成Book类型Book(const string& book_name):author("Stanley B.Lippman"){this->book_name = book_name;}//same_author的形参是const Book&bool same_author(const Book& book)const;private:string book_name;string author;};bool Book::same_author(const Book& book)const{return (this->author == book.author);}int main(void){//定义了一本书Inside C++ Object Model,其作者是缺省的Book a_book("Inside C++ Object Model");//定义一个字符串,作为一本书的书名string b_book_name("C++ Primer");//下面这种调用方式将会产生编译错误:不能将参数1从"const char[11]"转换成"const Book&"//if (a_book.same_author("C++ Primer"))//按照常理,if中的same_author的参数应该是Book类型,//但在这里,我们传入了一个string类型的实参b_book_name,//它将会隐式调用Book类的对应的构造函数,并将其换成一个//临时的Book对象,这样便满足了same_author的参数要求if(a_book.same_author(b_book_name)){cout<<"The great 2 books are written by great Stanley B.Lippman"<<endl;}else{cout<<"Different authors for those 2 books."<<endl;}return 0;}
下面说说explicit这个关键字的作用。
如果把上面程序中Book类的构造函数:
Book(const string&book_name) : author("Stanley B. Lippman")
改成:explicit Book(const string&book_name) : author("Stanley B. Lippman")
那么原来的程序将会出现编译错误:
“Book::same_author”: 不能将参数1 从“std::string”转换为“constBook &”
explicit关键字,将会阻止原来的隐式转换。这时如果把if(a_book.same_author(b_book_name))
改成
Bookb_book(b_book_name);
if(a_book.same_author(b_book))
就可以了。
#include <iostream>#include <string>using namespace std;class Book{public://如果一个类的构造函数只接收一个实参(argument),那么就定义一个从形参(parameter)数据类型到类的类型//的隐式转换。因此,在下面的构造函数,可隐式地将string类型转换成Book类型explicit Book(const string& book_name):author("Stanley B.Lippman"){this->book_name = book_name;}//same_author的形参是const Book&bool same_author(const Book& book)const;private:string book_name;string author;};bool Book::same_author(const Book& book)const{return (this->author == book.author);}int main(void){//定义了一本书Inside C++ Object Model,其作者是缺省的Book a_book("Inside C++ Object Model");//定义一个字符串,作为一本书的书名string b_book_name("C++ Primer");Book b_book(b_book_name);if(a_book.same_author(b_book)){cout<<"The great 2 books are written by great Stanley B.Lippman"<<endl;}else{cout<<"Different authors for those 2 books."<<endl;}return 0;}
0 0
- 关键字explicit详解(一)
- C++ explicit关键字详解
- c++ explicit关键字详解
- C++ explicit关键字详解
- C++ explicit关键字详解
- C++ explicit关键字详解
- C++ explicit关键字详解
- C++ explicit关键字详解
- C++ explicit关键字详解
- C++ explicit关键字详解
- C++ explicit关键字详解
- C++ explicit关键字详解
- C++ explicit关键字详解
- C++ explicit关键字详解
- C++ explicit关键字详解
- C++ explicit关键字详解
- C++ explicit关键字详解
- C++ explicit关键字详解
- 最长回文子串 HDU3068 POJ3974 CF.7D
- oracle经典查询练手-练习1
- 黑马程序员_Java基础_IO流(二)_19
- 题目1131:合唱队形
- C++的前向声明、嵌套类、局部类
- 关键字explicit详解(一)
- GOPATH与工作空间
- hdu 1238 Substrings(暴力枚举)
- 简单的 Android 拍照并显示以及获取路径后上传
- Hdu 4409 Family Name List (LCA 家谱 STL 2012金华网赛)
- How to use list from sys/queue.h?
- 【SDOI2011】【BZOJ】【P2241】【打地鼠】【题解】
- nginx安装启动
- 百度计算广告学沙龙学习笔记 - 品牌展示广告