C++ 类的隐式转换
生活随笔
收集整理的這篇文章主要介紹了
C++ 类的隐式转换
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
所謂類的隱式轉換,就是將實參類型轉成形參類型--如果不一致的話。
這個轉換與基本類型轉換不太一樣,具體則是在形參類型的構造函數中使用實參類型的數據,從而構造出一個臨時對象。
?
下面的代碼,類Person?的成員函數?isSamePerson(const Person &person) const?,理論上需要一個?Person 引用,但實際上被傳遞了一個?string對象!
編譯器會自動調用?Person tmp(str)構造函數?來構造一個臨時對象,而不是真的將 string類型 轉成 Person 類型!
?
代碼:
#include <iostream> #include <string>using namespace std;class Person{private:string name;int id;public:Person(const string &nm=string("xxx")):name(nm),id(0){} //就不用默認無參構造了 ;隱式轉換public:bool isSamePerson (const Person &person) const{ //const成員函數 ,只能調用const成員(變量、函數)!cout<<"比較對象:"<<person.getId()<<"--"<<person.getName()<<endl;//return id == person.getId(); //}const int &getId() const{ //任意一個const去掉后,都會導致問題。。。 return id;}const string &getName() const{ //因為const修飾的是this指向的對象,所以也必須返回const引用return name;} };int main(){string a="aaa";Person p1(a);cout<<p1.getId()<<"--"<<p1.getName()<<endl;string b="bbb";cout<<p1.isSamePerson(b)<<endl; //隱式轉換!!! return 0; }盡管有時候這樣的轉換是我們需要的,但也有不需要的時候,這個時候,給類中的構造函數聲明加上explicit,則會防止在需要隱式轉換的上下文中使用該構造函數。
#include <iostream> #include <string>using namespace std;class Person{private:string name;int id;public:explicit Person(const string &nm=string("xxx")):name(nm),id(0){} //就不用默認無參構造了 ;顯式 explicitpublic:bool isSamePerson (const Person &person) const{ //const成員函數 cout<<"比較對象:"<<person.getId()<<"--"<<person.getName()<<endl;//return id == person.getId(); //}const int &getId() const{ //任意一個const去掉后,都會導致問題。。。 return id;}const string &getName() const{ //因為const修飾的是this指向的對象,所以也必須返回const引用 return name;} };int main(){string a="aaa";Person p1(a);cout<<p1.getId()<<"--"<<p1.getName()<<endl;string b="bbb";cout<<p1.isSamePerson(Person(b))<<endl;//顯式轉換!!! return 0; }?
?
結論:除非有明顯的理由想要使用隱式轉換,否則,單形參的構造函數應該設置為explicit?。
?
?
其他:前向聲明只能用于使用指針或引用的情況。
總結
以上是生活随笔為你收集整理的C++ 类的隐式转换的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++之error: cannot bi
- 下一篇: linux cp 命令使用一角