訪問控制和封裝
友元名字查詢與類的作用域
類的靜態成員與普通成員
在成員函式中,可以直接訪問資料成員,而在這個過程中實際上隱式地使用了乙個名為this的隱式指標,該指標指向正是這個類物件。
#include
using
namespace
std;
struct people;
};int main(int argc, const
char * ar**) ;
cout
<< p.getname() << endl;
return
0;}
重點注意:在語句string getname() const;
中,const修飾的是this指標,在這裡,this指標的預設型別為people *const
,為指向非常量型別的常量指標。在函式後加上const宣告,可以將this指標宣告為const people *const
型別。這裡如果不加const宣告的話,將會報錯,因為類物件p是乙個常量。
成員函式也可以在類外部定義,需要加上作用域運算子:
#include
using
namespace
std;
struct people;
string people::getname() const
int main(int argc, const
char * ar**) ;
cout
<< p.getname() << endl;
return
0;}
如果類沒有宣告任何建構函式,就會合成預設的建構函式。如果需要預設建構函式,需要定義。
#include
using
namespace
std;
struct people;
};int main(int argc, const
char * ar**)
一旦定義建構函式,就不會自動生成預設建構函式
#include
using
namespace
std;
struct people
people(const
string &name, int age): name(name),age(age){}
string name = "summer";
int age = 26;
string getname() const;
};int main(int argc, const
char * ar**)
使用預設建構函式時要注意去掉物件名後的空括號對。
//定義了乙個沒有形參返回型別為people的函式,而不是物件
people p();
//正確地使用預設建構函式初始化物件
people p;
建構函式有乙個隱式轉換的規則,例如people類定義了乙個接受string型別的建構函式,就可以在需要使用people的時候用string代替。
struct people
string name ;
int age ;
string getname() const;
};void getage(const people &p)
int main(int argc, const
char * ar**)
但是編譯器只會自動地執行一步型別轉換。
// 錯誤,隱式地使用了兩種轉換
getage("summer");
//正確,顯示轉換為string,再隱式轉換為people
getage(string("summer"));
//正確,隱示轉換為string,再顯式轉換為people
getage(people("summer"));
如果不想通過建構函式,隱式地轉換類,可以在建構函式前加上關鍵字explicit。然後就只能使用強制轉換的方式了。
// 錯誤,建構函式是explicit的
getage(s);
// 正確,兩種採用建構函式實行強制轉換的方式
getage(people(s));
getage(static_cast
(s));
在c++中,class和struct唯一區別是,class中成員預設是private的,struct中成員預設是public。
using
namespace
std;
class people;
private:
int age = 26;
};
using
namespace
std;
class people;
};
using
namespace
std;
class people;
private:
int age = 26;
};
以上三個類完全一樣。
可以通過設定友元的方法來讓其他函式訪問類的私有成員。
using
namespace
std;
class people;
private:
int age = 26;
};int getage(people &p)
也可以設定其他類為類的友元。
using
namespace
std;
class people;
private:
int age = 26;
};class do;
void do::setage()
也可以只讓do的成員函式setage()成為people類的友元
using
namespace
std;
//需要在宣告友元函式前先宣告友元函式所屬的類
class do;
class people;
private:
int age = 26;
};void do::setage()
成員函式中使用的名字按照如下方式解析:
1.首先在成員函式內查詢該名字的宣告,只有在函式使用之前出現的宣告才考慮。
2.如果成員函式內沒有找到,則在類內繼續查詢,這時類的所有成員都可以被考慮。
3.如果類內也沒有找到該名字的宣告,在成員函式定義之前的作用域內查詢。
typedef string
type;
type initval();
class test;
//返回型別出現在函式名之前,返回型別在類的作用域外,需要用::指明所屬的類
test::type test::setval(type t)
//前乙個type是全域性宣告,後乙個type在類的作用域內,所以這裡都不需要用::
type test::setval2(type t)
靜態成員可以是不完全型別。
//宣告乙個不完全型別a,只知道a是乙個類型別,不知道包含多少成員
class
a;class
people;
靜態成員可以用作預設實參
class
people;
};
C 面試常考基礎知識總結
c 中,記憶體分為5個區 堆 棧 自由儲存區 全域性 靜態儲存區和常量儲存區。堆疊 管理方式由程式設計師控制 編譯器自動管理 系統響應遍歷記錄空閒記憶體位址的鍊錶,尋找第乙個大於所申請空間的節點,進行記憶體分配不超出棧的剩餘空間,系統自動分配 空間大小4g 具體看情況 2m,有的ide可以設定 碎片...
C 類 基礎知識
目錄3.2 複製建構函式 3.3 析構函式 4.類組合 class class name功能 用於在建立類時給類設定初值 形式note 在宣告中定義了預設引數時,實現中不能再指定預設引數。下面 執行會報錯 void func int x 0 void func int x 0 呼叫時機 預設建構函式...
c 基礎知識總結
建構函式 1.建構函式沒有返回值,函式名就是類名 2.建構函式可以過載,以滿足對物件不同引數的需求。實參決定了呼叫哪個建構函式 3.建構函式在定義物件的時候由系統自動呼叫。且每個物件只呼叫一次。4.無參建構函式和全預設建構函式都是預設建構函式,且這倆只能存在乙個 二義性問題 5.建構函式不可以用co...