大家好,本次給大家分享的內(nèi)容是C++里面的初始化列表運(yùn)用,希望對大家有幫助。
一、引出列表的使用:
1、在介紹列表之前,我們先來看看使用const關(guān)鍵字來修飾類中的成員會有什么事情發(fā)生,下面是一段簡單代碼:
#include <stdio.h>
class Test{
private:
const int a;
public:
int getA()
{
return a;
}
};
int main()
{
return 0;
}
編譯:
root@txp-virtual-machine:/home/txp/c++# g++ test.cpp
root@txp-virtual-machine:/home/txp/c++#
從編譯結(jié)果來看,沒毛病,完全和正常修飾一個成員一樣;為了要顯示這里的細(xì)節(jié)問題,我們來創(chuàng)建一個對象,進(jìn)而調(diào)用類里面的方法來獲取成員a的值:
#include <stdio.h>
class Test{
private:
const int a;
public:
int getA()
{
return a;
}
};
int main()
{
Test t;
printf("the t.a(chǎn) is %d",t.getA());
return 0;
}
編譯:
root@txp-virtual-machine:/home/txp/c++# g++ test.cpp
test.cpp:3:7: error: uninitialized const member in ‘class Test’
test.cpp:5:16: note: ‘const int Test::a’ should be initialized
const int a;
通過編譯我們發(fā)現(xiàn)他報了一個錯誤,說成員a沒有進(jìn)行初始化;那么沒有初始化,我們就給成員a一個值來進(jìn)行初始化:
#include <stdio.h>
class Test{
private:
const int a;
public:
Test()
{
a=666;
}
int getA()
{
return a;
}
};
int main()
{
Test t;
printf("the t.a(chǎn) is %d",t.getA());
return 0;
}
我們是用了無參構(gòu)造函數(shù)對a進(jìn)行初始化(private里面的成員不能直接初始化,被保護(hù)住了,這個知識是基本常識哈),下面編譯看看,會有啥現(xiàn)象發(fā)生:
root@txp-virtual-machine:/home/txp/c++# g++ test.cpp
test.cpp: In constructor ‘Test::Test()’:
test.cpp:7:6: error: uninitialized const member in ‘const int’ [-fpermissive]
Test()
^~~~
test.cpp:5:16: note: ‘const int Test::a’ should be initialized
const int a;
^
test.cpp:9:11: error: assignment of read-only member ‘Test::a’
a=666;
和沒有const關(guān)鍵字修飾的成員還不一樣,上面說a還是要初始化,也就是我們在構(gòu)造函數(shù)體里面對a進(jìn)行進(jìn)行初始賦值是行不通的哦,那該如何解決解決這個問題呢?答案來了,就是我們的初始化列表。
二、初始化列表“閃亮登場”:
1、首先我們先來看一下初始haul列表的書寫格式:
ClassName::ClassName:
m1(v1),m2(v1,v2),m3(v3)
{
}
從上面我們可以發(fā)現(xiàn),初始化列表就是在構(gòu)造函數(shù)名稱后面且在構(gòu)造函數(shù)體之間。同時這里我們也要注意初始化列表的使用原則:
(1)成員的初始化順序與成員的聲明順序相同。
(2)成員的初始化順序與初始化列表中的位置無關(guān)。
(3)初始化列表優(yōu)先于構(gòu)造函數(shù)的函數(shù)體執(zhí)行。
我們接著上面那個初始的問題,現(xiàn)在我們使用初始化列表來看看啥情況:
#include <stdio.h>
class Test{
private:
const int a;
public:
Test():a(666)
{
// a=666;
}
int getA()
{
return a;
}
};
int main()
{
Test t;
printf("the t.a(chǎn) is %d",t.getA());
return 0;
}
編譯:
root@txp-virtual-machine:/home/txp/c++# g++ test.cpp
root@txp-virtual-machine:/home/txp/c++# ls
a.out test.cpp
root@txp-virtual-machine:/home/txp/c++# ./a.out
the t.a(chǎn) is 666
問題被完美解決,是不是心里很開心哈。接下來我們繼續(xù)舉一個上面規(guī)則里面說的初始化順序問題:
#include <stdio.h>
class Value{
private:
int b;
public:
Value(int c)
{
printf("the c is %d",c);
b=c;
}
int getB()
{
return b;
}
};
class Test{
private:
Value d1;
Value d2;
Value d3;
public:
Test():d2(2),d1(1),d3(3)
{
printf("TXP ");
}
};
int main()
{
Test t;
return 0;
}
編譯:
root@txp-virtual-machine:/home/txp/c++# g++ test.cpp
root@txp-virtual-machine:/home/txp/c++# ./a.out
the c is 1
the c is 2
the c is 3
TXP
從上面的輸出結(jié)果我們可以初始化的順序與成員的聲明順序有關(guān),同時他也先于構(gòu)造函數(shù)體的執(zhí)行。
三、類中的const成員:
現(xiàn)在我們來總結(jié)一下在類中使用const關(guān)鍵字來修飾類中的屬性時,這時的屬性有啥特征:
(1)類中的const成員會被分配空間的。
(2)類中的const成員的本質(zhì)是只讀變量。
(3)類中的const成員只能再初始化列表中指定初始值
(4)編譯器無法直接得到const成員的初始值,因此無法進(jìn)入到符號表成為真正意義上的常量(也就是說這里的只讀變量,我們還是可以通過一定的手段來改變其值的大小。)
下面我們來看一個例子:
#include <stdio.h>
class Value{
private:
int b;
public:
Value(int c)
{
printf("the c is %d",c);
b=c;
}
int getB()
{
return b;
}
};
class Test{
private:
const int f;
Value d1;
Value d2;
Value d3;
public:
Test():d2(2),d1(1),d3(3),f(888)
{
printf("TXP");
}
int getF()
{
return f;
}
int setF(int i)
{
int *p = const_cast<int*>(&f);
*p = i;
}
};
int main()
{
Test t;
printf("the f is %d",t.getF());
t.setF(666);
printf("the f is %d",t.getF());
}
編譯:
root@txp-virtual-machine:/home/txp/c++# g++ test.cpp
root@txp-virtual-machine:/home/txp/c++# ./a.out
the c is 1
the c is 2
the c is 3
TXP
the f is 888
the f is 666
通過上面的例子,我們的結(jié)論都得到了一一驗(yàn)證。
四、總結(jié):
(1)類中可以使用初始化列表對成員進(jìn)行初始化。
(2)初始化列表先于構(gòu)造函數(shù)體執(zhí)行。
(3)類中可以定義const成員變量。
(4)const成員變量必須在初始化列表中指定初值。
(5)const成員變量只為只讀變量。
以上就是本次的學(xué)習(xí)分享。純屬個人學(xué)習(xí)c++的成長之旅。
-
可編程邏輯
+關(guān)注
關(guān)注
7文章
514瀏覽量
44054 -
C++
+關(guān)注
關(guān)注
21文章
2100瀏覽量
73453
發(fā)布評論請先 登錄
相關(guān)推薦
評論