关键字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