c 學習之路(1) 基本資料型別

2021-10-09 06:26:05 字數 4377 閱讀 9881

包含:整型、字元型、布林型、浮點型、空型別,指標型別。

1.1整型

c++有四種整型型別:short、int、long、long long,每種都有signed(有符號,預設)、unsigned(無符號)兩種分類,有符號整數既可以表示非負整數,又可以表示負整數;但是,無符號整數不能表示負數,只能表示非負整數。

在c++的實現中,每一種型別在不同系統上使用的儲存位數(寬度)是不同的,其規則為:

● short至少16位

● int至少與short一樣長

● long至少32位,且至少與int一樣長

● long long至少64位,且至少與long一樣長

1.2字元型

型別大小

char

8位(即可表示28個字元)

wchar_t

16位char16_t

16位char32_t

32位1.3布林型別

當表示式需要乙個算術值時 布林物件和布林文字都被隱式地提公升成 int(正 如下面的例子) false 變成 0 而 true變成1,bool型別不確定大小

1.4浮點型

型別大小

位數float

32為單精度浮點數

7double

64位雙精度浮點數

15/16

1.5空型別

關鍵字 void

1.6指標型別

《型別》

*《指標變數》

;

包含:陣列、結構體(struct)、聯合體(union)、列舉(enum)

2.1陣列型別

int a[

100]=;

//一維陣列

int a[2]

[3]=

,}

2.1結構體型別
struct 名稱結構體變數名;

struct infoinfo[size]

;

2.2聯合體型別

共用記憶體

union 名稱

;

2.3列舉型別
enum 列舉名 列舉變數;
#include

using

namespace std;

//類通常定義在函式外面

class

student};

intmain()

pstu -

> name =

"小明"

;pstu -

> age =15;

pstu -

> score =

92.5f

;pstu -

>

say(

);

class

student

;//函式定義//需要先在類體中定義函式名稱,可以再外賣重新定義實現

void student::

say(

)

在類體中直接定義函式時,不需要在函式名前面加上類名,因為函式屬於哪乙個類是不言而喻的。

但當成員函式定義在類外時,就必須在函式名前面加上類名予以限定。::被稱為域解析符(也稱作用域運算子或作用域限定符),用來連線類名和函式名,指明當前函式屬於哪個類。

成員函式必須先在類體中作原型宣告,然後在類外定義,也就是說類體的位置應在函式定義之前。

在類體中定義的成員函式會自動成為內聯函式,在類體外定義的不會。當然,在類體內部定義的函式也可以加 inline 關鍵字,但這是多餘的,因為類體內部定義的函式預設就是內聯函式。

私有成員變數大都以m_開頭,這是約定成俗的寫法,不是語法規定的內容。以m_開頭既可以一眼看出這是成員變數,又可以和成員函式中的形參名字區分開。

物件建立分別為每個物件的成員變數分配記憶體,但是所有物件都共享同一段函式**。物件的大小只受成員變數的影響,和成員函式沒有關係。成員函式在**區分配記憶體,而不是在棧區。

物件的記憶體中只保留了成員變數,除此之外沒有任何其他資訊,程式執行時不知道 stu 的型別為 student,也不知道它還有四個成員函式 setname()、setage()、setscore()、show(),c++ 究竟是如何通過物件呼叫成員函式的呢?

c++函式的編譯

c++和c語言的編譯方式不同。c語言中的函式在編譯時名字不變,或者只是簡單的加乙個下劃線_(不同的編譯器有不同的實現),例如,func() 編譯後為 func() 或 _func()。

而c++中的函式在編譯時會根據它所在的命名空間、它所屬的類、以及它的引數列表(也叫引數簽名)等資訊進行重新命名,形成乙個新的函式名。這個新的函式名只有編譯器知道,對使用者是不可見的。對函式重新命名的過程叫做名字編碼(name mangling),是通過一種特殊的演算法來實現的。

name mangling 的演算法是可逆的,既可以通過現有函式名計算出新函式名,也可以通過新函式名逆向推演出原有函式名。name mangling 可以確保新函式名的唯一性,只要函式所在的命名空間、所屬的類、包含的引數列表等有乙個不同,最後產生的新函式名也不同。這樣通過傳遞物件指標就完成了成員函式和成員變數的關聯。這與我們從表明上看到的剛好相反,通過物件呼叫成員函式時,不是通過物件找函式,而是通過函式找物件。

類體中有兩個成員建構函式(constructor)和析構函式(destructor),建構函式的名字和類名相同而析構函式的名字是在類名前面加乙個~符號。有了建構函式在建立物件的同時為成員變數賦值。

建構函式:

class

student

;//:相當於賦值

student

(char

*name,

int age,

float score)

;//為名稱命名

~student();

//宣告普通成員函式

void

show()

;};

建構函式也可以過載,可以使用初始化列表,在初始化列表中成員變數的賦值順序由它們在類中的宣告順序決定,初始化 const 成員變數的唯一方法就是使用初始化列表。

析構函式是沒有引數,編譯器會自動新增,也可以主動寫上去.

new 建立的物件位於堆區,通過 delete 刪除時才會呼叫析構函式;如果沒有 delete,析構函式就不會被執行。

成員函式中可以使用this,並且這個類例項化以後可以使用

靜態變數需要在類體之外賦值,沒有初始化不能使用

訪問靜態變數

//通過類類訪問 static 成員變數

student::m_total =10;

//通過物件來訪問 static 成員變數

student stu

("小明",15

,92.5f);

stu.m_total =20;

//通過物件指標來訪問 static 成員變數

student *pstu =

newstudent

("李華",16

,96);

pstu -

> m_total =

20`

注意:static 成員變數不占用物件的記憶體,而是在所有物件之外開闢記憶體,即使不建立物件也可以訪問

普通成員函式可以訪問所有成員(包括成員變數和成員函式),靜態成員函式只能訪問靜態成員和靜態成員函式

const class *p = new class(params);

class const *p = new class(params);

常物件定義方法

class

student

;student::

student

(char

*name,

int age,

float score)

:m_name

(name)

,m_age

(age)

,m_score

(score)

void student::

show()

//定義常成員函式

char

* student::

getname()

const

int student::

getage()

const

float student::

getscore()

const

需要強調的是,必須在成員函式的宣告和定義處同時加上 const 關鍵,只能呼叫常物件成員(常變數和常函式)

借助關鍵字友元(friend),可以使得其他類中的成員函式以及全域性範圍內的函式訪問當前類的 private 成員。

C 學習 基本資料型別

整型,字元型,布林型,浮點型 c c 標準只定義了最低的位數,而不是必需的固定位數 bool 布林型 char 字元型 8位 wchar t 寬字元型 16位 short 短整型 16位 int 整形 16位 long 長整形 32位 float 單精度浮點型 6為有效數字 double 雙精度浮點...

1 基本資料型別

python 3支援int float bool complex 複數 a,b,c,d 20,5.5,true,3 4jprint type a type b type c type d class int class float class bool class complex a 4 5 加法 ...

swift學習1 基本資料型別

今天學習swift的資料型別,進行一下小結 1.首先是常量變數,常量的定義的let,變數的定義是var 2.資料型別,int uint float double 都是結構體的定義 int還可以細分為 int8 int16 int32 int64 例如int8的最大值,可以呼叫 int8.max 3....