C 面試基礎知識總結 類

2021-09-23 19:40:00 字數 3934 閱讀 1383

訪問控制和封裝

友元名字查詢與類的作用域

類的靜態成員與普通成員

在成員函式中,可以直接訪問資料成員,而在這個過程中實際上隱式地使用了乙個名為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...