最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

c++primer類(lèi)詳解

 更新時(shí)間:2021年09月27日 11:09:43   作者:旋轉(zhuǎn)吧!風(fēng)火輪  
今天小編就為大家分享一篇關(guān)于C++Primer中變量和基本類(lèi)型的文章,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧

類(lèi)的基本思想是數(shù)據(jù)抽象和封裝。

數(shù)據(jù)抽象是依賴(lài)接口和實(shí)現(xiàn)分離的編程技術(shù)。

1. 定義抽象數(shù)據(jù)類(lèi)型

1.1 設(shè)計(jì)Sales_data類(lèi)

  • 成員函數(shù)的聲明必須在類(lèi)內(nèi)部,定義可以在內(nèi)部或外部
  • 作為接口的非成員函數(shù),如print、read,聲明定義都在類(lèi)的外部。
  • 定義在類(lèi)內(nèi)部的函數(shù)都是隱式的inline函數(shù)
  • 調(diào)用一個(gè)成員函數(shù)時(shí),隱式初始化this指針
  • 任何自定義名為this的參數(shù)或者變量都是非法的
  • const成員函數(shù)
    •  const成員函數(shù):在參數(shù)列表后加上const關(guān)鍵字的函數(shù)
    • const的作用是修改隱式this指針的類(lèi)型
    • 默認(rèn)情況下,this的類(lèi)型是指向類(lèi)型非常量的常量指針。因此,不能將this綁定在一個(gè)非常量對(duì)象上(不能把this綁定到其他對(duì)象),所以也不能在常量對(duì)象上調(diào)用普通成員函數(shù)(不能用const 對(duì)象訪問(wèn)普通成員函數(shù))。
    • const成員函數(shù)提高了函數(shù)靈活性
  • 常量對(duì)象,以及常量對(duì)象的引用或指針只能調(diào)用常量成員函數(shù)。
  • 編譯器分兩步處理類(lèi)。
    • 1.編譯成員聲明。
    • 2.所有成員聲明編譯完后,編譯成員函數(shù)體。因此,成員聲明出現(xiàn)在成員函數(shù)體后,編譯器也可以正常編譯
  • 在類(lèi)外定義函數(shù)體
    • 需要在函數(shù)名前加上類(lèi)名::,在類(lèi)名之后剩余的代碼位于作用域之內(nèi)
    • 若返回類(lèi)型也是在類(lèi)內(nèi)聲明的,就需要在函數(shù)名和返回類(lèi)型前都加上類(lèi)名::。
    • 若在類(lèi)內(nèi)聲明成了const成員函數(shù),在外部定義時(shí),const關(guān)鍵字也不能省略。
  • 若需要返回類(lèi)本身,使用return *this 

1.2 定義類(lèi)相關(guān)的非成員函數(shù)

  • 類(lèi)相關(guān)非成員函數(shù):屬于類(lèi)的接口,但是不屬于類(lèi)本身。
  • 通常把函數(shù)聲明和定義分開(kāi)。和類(lèi)聲明在同一頭文件內(nèi)。
  • 通常情況下,拷貝一個(gè)類(lèi)其實(shí)是拷貝其成員。(若想拷貝執(zhí)行其他操作,查閱拷貝賦值函數(shù))
Sale_data s1;
Sale_data s2=s1;//s2拷貝了s1的成員

1.3構(gòu)造函數(shù)

  • 構(gòu)造函數(shù)的任務(wù)是初始化類(lèi)對(duì)象的數(shù)據(jù)成員
  • 只要類(lèi)對(duì)象被創(chuàng)建,一定會(huì)執(zhí)行構(gòu)造函數(shù)
  • 構(gòu)造函數(shù)名與類(lèi)名相同,并且沒(méi)有返回類(lèi)型,其他與普通函數(shù)相同。
  • 構(gòu)造函數(shù)不能聲明成const
  • 默認(rèn)構(gòu)造函數(shù)
    • 默認(rèn)構(gòu)造函數(shù)無(wú)需任何實(shí)參
    • 若沒(méi)有為類(lèi)顯式定義任何構(gòu)造函數(shù),編譯器隱式構(gòu)造一個(gè)合成的默認(rèn)構(gòu)造函數(shù)。
    • 合成的默認(rèn)構(gòu)造函數(shù)按照如下規(guī)則初始化類(lèi)成員
      • 若存在類(lèi)內(nèi)初始值,用它來(lái)初始化成員
      • 否則,默認(rèn)初始化成員
    • 某些類(lèi)不能依賴(lài)合成的默認(rèn)構(gòu)造函數(shù)
      • 若類(lèi)包含內(nèi)置類(lèi)型或復(fù)合類(lèi)型成員,只有當(dāng)這些值全被賦予了類(lèi)內(nèi)初始值時(shí),這個(gè)類(lèi)才適合使用合成的默認(rèn)構(gòu)造函數(shù)。
      • 若類(lèi)a包含一個(gè)成員類(lèi)b,若b沒(méi)有默認(rèn)構(gòu)造函數(shù),則編譯器無(wú)法為a構(gòu)造正確的默認(rèn)構(gòu)造函數(shù)
      • 若定義了其他構(gòu)造函數(shù),則編譯器不會(huì)構(gòu)造默認(rèn)初始函數(shù)
class A{
//定義了一個(gè)實(shí)參為string的構(gòu)造函數(shù)
//此時(shí),編譯器不會(huì)合成默認(rèn)構(gòu)造函數(shù)
	A(std::string a){}
}
A a;//錯(cuò)誤,沒(méi)有默認(rèn)構(gòu)造函數(shù)
A a1(std::string("小黑"));//只能用string參數(shù)
  • 參數(shù)列表后加上 =defualt表示要求編譯器生成默認(rèn)構(gòu)造函數(shù)
  • =defualt可以和聲明一起出現(xiàn)在類(lèi)內(nèi),也可以作為定義出現(xiàn)在類(lèi)外。

若在類(lèi)內(nèi)部,則默認(rèn)構(gòu)造函數(shù)時(shí)內(nèi)聯(lián)的,若在類(lèi)外部,默認(rèn)不是內(nèi)聯(lián)的。

class A{
	A()=defualt;
}
A a;//正確,編譯器生成默認(rèn)構(gòu)造函數(shù)
  • 構(gòu)造函數(shù)初始值列表
    • 存在編譯器不支持類(lèi)內(nèi)初始值,這樣的話(huà)默認(rèn)構(gòu)造函數(shù)不適用(因?yàn)槟J(rèn)構(gòu)造函數(shù)使用類(lèi)內(nèi)初始值初始化類(lèi)成員),這時(shí)應(yīng)該使用構(gòu)造函數(shù)初始值列表。
    • 函數(shù)初始值列表是參數(shù)列表如下所示(冒號(hào)以及冒號(hào)和花括號(hào)間的代碼::bookNo(s))
    • 構(gòu)造函數(shù)不應(yīng)該輕易覆蓋掉類(lèi)內(nèi)初始值,除非新賦的值與原值不同在
    • 構(gòu)造函數(shù)的過(guò)程中,沒(méi)有出現(xiàn)在函數(shù)初始化列表中的成員將被執(zhí)行默認(rèn)初始化
class Sales_data{
	Sales_data(const std::string &s,unsigned n,double p):
	bookNo(s),units_sold(n),revenue(p*n){}
	//當(dāng)編譯器不支持類(lèi)內(nèi)初始值時(shí),可用如下方法定義
	Sales_data(const std::string &s):
	bookNo(s),units_sold(0),revenue(0){}
}
  • 在類(lèi)外部定義構(gòu)造函數(shù),要聲明是哪個(gè)類(lèi)的構(gòu)造函數(shù),在函數(shù)名前加上類(lèi)名::
Sales_data::Sales_data(std::istream cin){
	read(cin,*this);
}

1.4 拷貝、賦值和析構(gòu)

  • 編譯器會(huì)為類(lèi)合成拷貝、賦值和銷(xiāo)毀操作。
  • 編譯器生成的版本對(duì)對(duì)象的每個(gè)成員執(zhí)行拷貝、賦值和銷(xiāo)毀操作

2 訪問(wèn)控制和封裝

  • 訪問(wèn)說(shuō)明符

public說(shuō)明符后的成員在整個(gè)程序內(nèi)可以被訪問(wèn)

private說(shuō)明符后的成員可以被類(lèi)的成員函數(shù)訪問(wèn)

  • 一個(gè)類(lèi)可以包含0個(gè)或多個(gè)訪問(wèn)說(shuō)明符,有效范圍到下一個(gè)說(shuō)明符出現(xiàn)為止。
  • class和struct關(guān)鍵字定義類(lèi)的唯一區(qū)別是
    • class在第一個(gè)訪問(wèn)說(shuō)明符出現(xiàn)之前的區(qū)域默認(rèn)是private
    • struct在第一個(gè)訪問(wèn)說(shuō)明符出現(xiàn)之前的區(qū)域默認(rèn)是public

2.1 友元

  • 類(lèi)可以允許其他類(lèi)或函數(shù)訪問(wèn)他的非公有成員。方法是用關(guān)鍵字friend聲明友元。
  • 友元的聲明只能在類(lèi)內(nèi)部
  • 友元聲明的位置不限,最好在類(lèi)定義開(kāi)始或結(jié)束前集中聲明友元。
  • 封裝的好處
    • 確保用戶(hù)代碼不會(huì)無(wú)意間破壞封裝對(duì)象的狀態(tài)
    • 被封裝的類(lèi)的具體實(shí)現(xiàn)細(xì)節(jié)可以隨時(shí)改變
  • 友元在類(lèi)內(nèi)的聲明僅僅指定了訪問(wèn)權(quán)限,并不是一個(gè)通常意義的函數(shù)聲明
    • 若希望類(lèi)的用戶(hù)能夠調(diào)用某個(gè)友元函數(shù),需要在友元聲明之外再專(zhuān)門(mén)對(duì)函數(shù)進(jìn)行一次聲明
    • 為了使友元對(duì)類(lèi)用戶(hù)可見(jiàn),友元聲明與類(lèi)本身防止在同一個(gè)頭文件中
    • 一些編譯器強(qiáng)制限定友元函數(shù)必須在使用之前在類(lèi)的外部聲明

2.2 類(lèi)的其他特性

接下來(lái)介紹:類(lèi)型成員、類(lèi)的成員的類(lèi)內(nèi)初始值、可變數(shù)據(jù)成員、內(nèi)聯(lián)成員函數(shù)、從成員函數(shù)返回*this、如何定義使用類(lèi)類(lèi)型、友元類(lèi)

2.2.1 類(lèi)成員再探

  • 類(lèi)別名(類(lèi)型成員):

 在類(lèi)中定義的類(lèi)型名字和其他成員一樣存在訪問(wèn)限制,可以是public或者private

類(lèi)別名必須先定義后使用

(回憶:類(lèi)成員變量可以在類(lèi)成員函數(shù)之后定義,但是在類(lèi)函數(shù)中使用,原因是編譯器先編譯類(lèi)成員變量后邊一類(lèi)成員函數(shù))

類(lèi)型成員通常出現(xiàn)在類(lèi)開(kāi)始的地方

class Screen{	
	public:
	//等價(jià)于 using pos = std::string::size_type
	typedef std::string::size_type pos;
}
  • 令成員作為內(nèi)聯(lián)函數(shù)

定義在類(lèi)內(nèi)部的函數(shù)是自動(dòng)inline的,定義在類(lèi)外部的函數(shù),若需要聲明內(nèi)聯(lián)函數(shù),要加上inline;inline成員函數(shù)也應(yīng)該和相應(yīng)的類(lèi)定義在同一個(gè)頭文件夾

inline 
Screen& Screen::move(pos r,pos c){
	pos row = r*width;
	cursor = row + c;
	return *this; 
}
  • 可變數(shù)據(jù)成員,永遠(yuǎn)不會(huì)是const,即使他是const對(duì)象的成員
class Screen{
public void some_member() const;
private:
	mutable size_t access_ctr;//使用mutable聲明可變數(shù)據(jù)成員
}
void Screen::some_member() const {
	++access_ctr;//即使在const成員函數(shù)中,仍然可以修改可變數(shù)據(jù)成員
}
  • 類(lèi)內(nèi)初始值使用=的初始化形式或者花括號(hào)括起來(lái)的直接初始化形式

2.2.2 返回*this的成員函數(shù)

  • 注意返回類(lèi)型是否是引用。是否是引用對(duì)函數(shù)的使用方法影響很大
inline Screen &Screen::set(char ch){
	content[cursor] =ch;
	return *this;
}
inline Screen &Screen ::move(pos r,pos col){
	cursor= r * width + col ;
	return *this;
}
Screen s(3,2,'');
//move函數(shù)返回s本身,所以可以接著調(diào)用set函數(shù)
//并且move函數(shù)返回的是Screen的引用,若返回的不是引用,則會(huì)返回一個(gè)新的Screen對(duì)象
s.move(3,2).set('!');
  • 從const函數(shù)返回的是常量引用,在const函數(shù)中無(wú)法修改類(lèi)成員變量
  • 使用const函數(shù)進(jìn)行重載

編寫(xiě)函數(shù)display打印Screen中的contents,因?yàn)橹皇钦故?,不需要修改值,所以這應(yīng)該是一個(gè)const函數(shù)。

但是希望實(shí)現(xiàn)在展示后,能移動(dòng)光標(biāo):s.display().move(2,3)。這要求display返回的值是可以修改的,所以這不應(yīng)該是const函數(shù)。

基于const重載,可以根據(jù)Screen對(duì)象是否是const來(lái)進(jìn)行重載。

  • 建議多使用do_display這類(lèi)函數(shù)完成實(shí)際工作,使公共代碼使用私有函數(shù)
    • 可以集中修改
    • 沒(méi)有額外開(kāi)銷(xiāo)
class Screen{
public:
	Screen* display(std::ostream &os){
		do_display(os);
		return *this;
	}  
	const Screen* display(std::ostream &os) const{
		do_display(os);
		return *this;
	} 
private:
	void do_display(std::ostream &os) const{
		os<<content;
	}
}
int main(){
	const Screen cs(3,3,'!');
	Screen s(3,3,'.')
	cs.display();//因?yàn)閏s是const的,調(diào)用第二個(gè)const函數(shù)
	s.display();//調(diào)用第一個(gè)非const的函數(shù)
}

2.2.3 類(lèi)類(lèi)型

  • 每個(gè)類(lèi)定義了唯一的類(lèi)型,即使成員完全相同,也是不一樣的類(lèi)。
class A{
int member;
}
class B{
int member;
}
A a;
B b = a;//錯(cuò)誤!!
  • 不完全類(lèi)型
    • 類(lèi)似于函數(shù),類(lèi)也可以只聲明,不定義,這被叫做不完全類(lèi)型
    • 不完全類(lèi)型是向程序說(shuō)明這是一個(gè)類(lèi)名
    • 不完全類(lèi)型使用環(huán)境很有限,只是可以定義指向這種類(lèi)型的指針或引用,聲明(但不能定義)以不完全類(lèi)型作為參數(shù)或返回類(lèi)型的函數(shù)。
  • 類(lèi)在創(chuàng)建前必須被定義
  • 類(lèi)的成員不能有類(lèi)本身(除了后面介紹的static類(lèi)),但是可以是指向自身的引用或指針

2.2.4 友元再探

  •  一個(gè)類(lèi)制定了其友元類(lèi),則友元函數(shù)可以訪問(wèn)該類(lèi)的所有成員
  • 友元關(guān)系不存在傳遞性
  • 每個(gè)類(lèi)自己負(fù)責(zé)控制自己的友元類(lèi)或友元函數(shù)
    • 定義友元函數(shù)的順序:

有一個(gè)screen類(lèi),有私有成員content;

有clear函數(shù),可以清除content的內(nèi)容。

1.先聲明clear函數(shù)

2.在screen類(lèi)中將clear函數(shù)函數(shù)定義為友元函數(shù)

3.定義clear函數(shù),使用screen類(lèi)

  • 定義友元類(lèi)

有類(lèi)window,window有私有成員content;友元類(lèi) window_mgr需要直接操作content。

  •  正常編寫(xiě)window類(lèi),在window類(lèi)中聲明:friend class window_mgr;
  • 正常編寫(xiě) window_mgr類(lèi),可以直接使用window的content
  • 注意將類(lèi)寫(xiě)在頭文件中,要按照如下格式;否則編譯會(huì)報(bào)錯(cuò)重復(fù)的類(lèi)定義
#ifndef xxx_H
#define xxx_H
/class 定義///
#endif
  • 一個(gè)類(lèi)想把一組重載函數(shù)定義為它的友元,需要對(duì)這組函數(shù)中的每一個(gè)進(jìn)行友元聲明。
  • 友元聲明僅僅表示對(duì)友元關(guān)系的聲明,但并不表示友元這個(gè)函數(shù)本身的聲明
struct X{
	friend viod f(){/*友元函數(shù)可以定義在類(lèi)的內(nèi)部,但是我認(rèn)為這樣沒(méi)有意義*/
	X(){f();}//錯(cuò)誤,f還沒(méi)有被定義
	void g();
	void h();
	}
	void X::g(){ return f();}//錯(cuò)誤,f還沒(méi)有被定義
	void f();
	void X::h(){return f();}//正確,f的聲明已經(jīng)在定義中了
};

2.4 類(lèi)的作用域

  • 定義在類(lèi)外的方法需要在方法名前使用::說(shuō)明該方法屬于哪一個(gè)類(lèi),在說(shuō)明屬于的類(lèi)后,該函數(shù)的作用域位于該類(lèi)內(nèi)。
    • 即返回類(lèi)型使用的名字位于類(lèi)的作用域之外。若返回類(lèi)型也是類(lèi)的成員,需要在返回類(lèi)型前使用::指明返回類(lèi)型屬于的類(lèi)
//pos的類(lèi)型聲明在window類(lèi)中,并且返回類(lèi)型在類(lèi)的作用域外,因此要使用window::pos
window::pos window::get_pos(){
//在window::get_pos后的所有代碼作用域在類(lèi)內(nèi),所以返回cursor,相當(dāng)于this->cursor
return cursor;
}

2.4.1 名字查找和類(lèi)的作用域

  • 類(lèi)的定義分兩步處理
    • 1.編譯成員的聲明
    • 2.直到類(lèi)成員全部可見(jiàn)后編譯函數(shù)體
  • 一般來(lái)說(shuō),內(nèi)層作用域可以重新定義外層作用域名字;但在類(lèi)中若使用了某個(gè)外層作用域中的名字,并且該名字表示一種類(lèi)型,則類(lèi)不能在之后重新定義該名字
typedef double Money;
class Acount{
public:
	Money balace(){return bal;}//使用外層定義的Money
private:
	typedef double Money;//錯(cuò)誤,不能重新定義Money
	Money bal;
}
  • 類(lèi)型名的定義通常出現(xiàn)在類(lèi)的開(kāi)始處,來(lái)確保所有使用該類(lèi)型的成員都出現(xiàn)在定義之后;
  • 類(lèi)中同名變量會(huì)被隱藏,但是可以用this指針訪問(wèn)成員變量
double height;
class Window{
	double height;
}
void Window::dummy_fcn(double height){
	double class_height = this->height;
	double para_height = height; 
	double  global_height = ::height;
}

2.5 構(gòu)造函數(shù)再探

2.5.1

  • 構(gòu)造函數(shù)初始值列表 在類(lèi)的有引用成員和const成員時(shí),必須在構(gòu)造函數(shù)中使用初始值列表進(jìn)行初始化
  • 建議養(yǎng)成使用構(gòu)造函數(shù)初始值的習(xí)慣
  • 初始值列表只說(shuō)明初始值成員的值,并不限定初始值的具體執(zhí)行順序;初始值順序與他們?cè)陬?lèi)定義中的出現(xiàn)順序一致(某些編譯器在初始值列表和類(lèi)中順序不一致時(shí),會(huì)生成一條警告信息)
//示例危險(xiǎn)操作
strcut X{
//實(shí)際上按照聲明順序初始化,先初始化rem時(shí),base的值未知
X(int i,int j):base(i),rem(base%j){}
int rem,base;
}
  • 建議,使用初始值列表和類(lèi)中變量順序一致,可能的話(huà),盡量避免使用某些成員初始化其他成員。

2.5.2 委托構(gòu)造函數(shù)

  • 成員初始值列表的唯一入口是類(lèi)名,可以用構(gòu)造函數(shù)可以調(diào)用其他構(gòu)造函數(shù),調(diào)用過(guò)程應(yīng)該寫(xiě)在初始值列表位置
class Sale_data{
public:
	Sales_data(const std::string &s,unsigned s_num,double price):units_sold(s_num),revenue(s_num*price),BookNo(s){}
	Sales_data():Sales_data("",0,0){}//委托給上一個(gè)構(gòu)造函數(shù)
}

2.5.3 默認(rèn)構(gòu)造函數(shù)的作用

  • 當(dāng)對(duì)象被默認(rèn)初始化或值初始化時(shí)執(zhí)行默認(rèn)構(gòu)造參數(shù)
  • 默認(rèn)初始化發(fā)生在:

 1.塊作用域內(nèi)不使用任何初始值定義的一個(gè)非靜態(tài)變量或者數(shù)組時(shí)

2.類(lèi)本身含有類(lèi)類(lèi)型的成員且使用合成的默認(rèn)構(gòu)造函數(shù)

3.類(lèi)類(lèi)型成員沒(méi)有在構(gòu)造函數(shù)初始值列表中顯式初始化時(shí)

  • 值初始化發(fā)生在:

1.初始化數(shù)組時(shí),提供的初始值數(shù)量少于數(shù)組大小

2.不使用初始值定義一個(gè)局部變量時(shí)

3.書(shū)寫(xiě)形如T()的表達(dá)式顯式請(qǐng)求值初始化時(shí),其中T是類(lèi)型名。如vector接受一個(gè)實(shí)參說(shuō)明vector的大小

  • 若定義了其他構(gòu)造函數(shù),編譯器不在生成默認(rèn)構(gòu)造函數(shù),因此最好需要我們程序員來(lái)提供一個(gè)構(gòu)造函數(shù)

2.5.4 隱式的類(lèi)類(lèi)型轉(zhuǎn)換

  • 轉(zhuǎn)換構(gòu)造函數(shù):能夠通過(guò)一個(gè)實(shí)參調(diào)用的構(gòu)造函數(shù)定義一條從構(gòu)造函數(shù)的參數(shù)構(gòu)造類(lèi)型向類(lèi)類(lèi)型轉(zhuǎn)換的規(guī)則。
vector<string> str_vec;
//需要push一個(gè)string,但傳參一個(gè)字符串。這里使用了string的轉(zhuǎn)換構(gòu)造函數(shù)
str_vec.push_back("小黑~");
  • 轉(zhuǎn)換構(gòu)造函數(shù)只允許一步構(gòu)造轉(zhuǎn)換
  • 需要多個(gè)參數(shù)的構(gòu)造函數(shù)無(wú)法執(zhí)行隱式轉(zhuǎn)換
//Sales_data有參數(shù)為string的構(gòu)造函數(shù)
//Sales_data的combine為方法:
//Sales_data & Sales_data::combine(const Sales_data& );
Sales_data item;
item.combine("無(wú)限~")//錯(cuò)誤,只允許一步構(gòu)造
item.combine(string("無(wú)限~"))//正確,只有string到Sales_data的一步隱式構(gòu)造轉(zhuǎn)換
  • 使用explicit抑制構(gòu)造函數(shù)定義的隱式轉(zhuǎn)換
class Sales_data{
explicit Sales_data(const string&):bookNo(s){};
...//其他聲明
}
item.combine(string("無(wú)限~"));//錯(cuò)誤,explicit阻止了隱式轉(zhuǎn)換

explicit函數(shù)只能用于直接初始化

//Sales_data的構(gòu)造函數(shù):explicit Sales_data(const string&):bookNo(s){};
string bookNo = "001";
Sales_data item1(bookNo);//正確,直接初始化
Sales_data item2 = bookNo;//錯(cuò)誤,拷貝初始化

盡管編譯器不會(huì)將explicit的構(gòu)造函數(shù)用于隱式轉(zhuǎn)換過(guò)程,但是可以使用顯式強(qiáng)制轉(zhuǎn)化

string bookNo ="001";
item.combine(bookNo);//錯(cuò)誤,explicit阻止了隱式轉(zhuǎn)換
item.combine(static_cast<Sales_data>(bookNo));//正確,強(qiáng)制轉(zhuǎn)換

2.5.5 聚合類(lèi)

  • 聚合類(lèi)的定義。一個(gè)滿(mǎn)足下列條件的類(lèi)被稱(chēng)為聚合類(lèi)

1.所有成員都是public的

2.沒(méi)有定義任何構(gòu)造函數(shù)

3.沒(méi)有類(lèi)內(nèi)初始值

4.沒(méi)有基類(lèi),也沒(méi)有virtual函數(shù)

  • 可以使用{}括起來(lái)的成員初始值列表來(lái)初始化聚合類(lèi)
class Data{
public:
	int ival;
	string s;
	}
//順序一定相同
Data val1={0,"孔子"};		

2.5.6 字面值常量

  • constexpr函數(shù)的參數(shù)和返回值必須是字面值類(lèi)型
  • 字面值類(lèi)型包括:算術(shù)類(lèi)型、指針、引用、數(shù)據(jù)成員都是字面值類(lèi)型的聚合類(lèi)和滿(mǎn)足下面條件的類(lèi)。

1.數(shù)據(jù)成員都是字面值類(lèi)型

2.類(lèi)必須含有一個(gè) constexpr構(gòu)造函數(shù)

3.使用默認(rèn)定義的析構(gòu)函數(shù)

4.如果一個(gè)數(shù)據(jù)成員含有類(lèi)內(nèi)初始值,則該初始值必須是一條常量表達(dá)式;如果數(shù)據(jù)成員屬于某種類(lèi)類(lèi)型,則初始值必須使用自己的constexpr構(gòu)造函數(shù)

  • 構(gòu)造函數(shù)不能是const的,但是可以是constexpr的。
  • 字面值常量類(lèi),至少提供一個(gè)constexpr構(gòu)造函數(shù)
  • constexpr構(gòu)造函數(shù)
    • 是構(gòu)造函數(shù),沒(méi)有返回語(yǔ)句
    • 是 constexpr函數(shù),唯一可執(zhí)行語(yǔ)句就是返回語(yǔ)句
    • 所以constexpr構(gòu)造函數(shù)函數(shù)體為空,只能通過(guò)初始化列表值來(lái)執(zhí)行構(gòu)造初始化
class Data{
public:
	constexpr Data(int para_i,string para_s):ival(para_i),s(para_s){}
	int ival;
	string s;
	}
constexpr Data data(1,"吃烤肉");

1.6 類(lèi)的靜態(tài)成員

  • 使用static在類(lèi)中聲明靜態(tài)成員,該靜態(tài)成員和類(lèi)關(guān)聯(lián),而不是和類(lèi)對(duì)象關(guān)聯(lián)
  • 靜態(tài)成員函數(shù)也不與任何類(lèi)對(duì)象綁定起來(lái),并且靜態(tài)成員函數(shù)不含this指針。(包括this的顯式調(diào)用和對(duì)非靜態(tài)成員的隱式調(diào)用)
  • 在外部定義static函數(shù)時(shí),不能重復(fù)static,static關(guān)鍵字出現(xiàn)類(lèi)內(nèi)部的聲明語(yǔ)句
  • 不能在類(lèi)內(nèi)部初始化靜態(tài)成員,必須在類(lèi)的外部定義和初始化每個(gè)靜態(tài)成員,因此一旦被定義,就一直存在在程序的整個(gè)生命周期
  • 想要確保對(duì)象只定義一次,最好的辦法就是把靜態(tài)數(shù)據(jù)成員的定義和其他非內(nèi)聯(lián)函數(shù)的定義放在同一個(gè)文件
  • 靜態(tài)成員的類(lèi)內(nèi)初始化
    • 一般情況下, 類(lèi)的靜態(tài)成員不應(yīng)該在類(lèi)的內(nèi)部初始化
    • 靜態(tài)成員必須是字面值常量類(lèi)型(constexpr)
    • 即使一個(gè)常量靜態(tài)數(shù)據(jù)成員在類(lèi)的內(nèi)部初始化了,通常也應(yīng)該放在類(lèi)的外部定義一下該成員(這樣才能使生命周期直到程序結(jié)束)。
  • 靜態(tài)成員的特殊使用場(chǎng)景
    • 靜態(tài)數(shù)據(jù)成員的類(lèi)型可以就是它所屬的類(lèi)型
class Bar{
public:
//...
provite:
	static Bar mem1;//正確,static成員可以是不完整類(lèi)型
	Bar* mem2;//正確,指針成員可以是不完整類(lèi)型
	Bar mem3;//錯(cuò)誤
}
- 靜態(tài)成員可以作為默認(rèn)實(shí)參
class Screen{
	public:
	Screen& clear(char = bkground)
	private:
	static const char bkground;
}

總結(jié)

本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

  • 基于C++浮點(diǎn)數(shù)(float、double)類(lèi)型數(shù)據(jù)比較與轉(zhuǎn)換的詳解

    基于C++浮點(diǎn)數(shù)(float、double)類(lèi)型數(shù)據(jù)比較與轉(zhuǎn)換的詳解

    本篇文章是對(duì)C++中浮點(diǎn)數(shù)(float、double)類(lèi)型數(shù)據(jù)比較與轉(zhuǎn)換進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • C語(yǔ)言植物大戰(zhàn)數(shù)據(jù)結(jié)構(gòu)堆排序圖文示例

    C語(yǔ)言植物大戰(zhàn)數(shù)據(jù)結(jié)構(gòu)堆排序圖文示例

    這篇文章主要為大家介紹了C語(yǔ)言植物大戰(zhàn)數(shù)據(jù)結(jié)構(gòu)堆排序的圖文示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05
  • 深入解析C語(yǔ)言中的內(nèi)存分配相關(guān)問(wèn)題

    深入解析C語(yǔ)言中的內(nèi)存分配相關(guān)問(wèn)題

    這篇文章主要深入地介紹了C語(yǔ)言中的內(nèi)存分配,C語(yǔ)言編程中的內(nèi)存泄漏問(wèn)題一直以來(lái)都是C編程中的一大棘手問(wèn)題,本文從malloc和指針等方面對(duì)C內(nèi)存進(jìn)行了深層次講解,強(qiáng)烈推薦!需要的朋友可以參考下
    2015-08-08
  • C++程序設(shè)計(jì)-五子棋

    C++程序設(shè)計(jì)-五子棋

    本文將以簡(jiǎn)單的存儲(chǔ)結(jié)構(gòu)及簡(jiǎn)單的運(yùn)算,條件語(yǔ)句,分支語(yǔ)句,循環(huán)語(yǔ)句結(jié)合,帶來(lái)一個(gè)雙人對(duì)戰(zhàn)版五子棋,這是一個(gè)簡(jiǎn)單的模型,實(shí)現(xiàn)了五子棋最最基本的功能。具有很好的參考價(jià)值,下面跟著小編一起來(lái)看下吧
    2017-02-02
  • C語(yǔ)言函數(shù)調(diào)用底層實(shí)現(xiàn)原理分析

    C語(yǔ)言函數(shù)調(diào)用底層實(shí)現(xiàn)原理分析

    這篇文章主要介紹了C語(yǔ)言函數(shù)調(diào)用底層實(shí)現(xiàn)原理,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • C++使用ffmpeg實(shí)現(xiàn)rtsp取流的代碼

    C++使用ffmpeg實(shí)現(xiàn)rtsp取流的代碼

    這篇文章主要介紹了C++使用ffmpeg實(shí)現(xiàn)rtsp取流,文章介紹了ffmepg采用rtsp取流流程圖,CMakeLists.txt編寫(xiě)方法,通過(guò)示例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-04-04
  • C++ 刪除字符串的2種方法小結(jié)

    C++ 刪除字符串的2種方法小結(jié)

    這篇文章主要介紹了C++ 刪除字符串的2種方法小結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-12-12
  • Windows安裝Qt6.4.2及簡(jiǎn)單驗(yàn)證

    Windows安裝Qt6.4.2及簡(jiǎn)單驗(yàn)證

    本文主要介紹了Windows安裝Qt6.4.2及簡(jiǎn)單驗(yàn)證,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • MySQL系列教程之使用C語(yǔ)言來(lái)連接數(shù)據(jù)庫(kù)

    MySQL系列教程之使用C語(yǔ)言來(lái)連接數(shù)據(jù)庫(kù)

    c語(yǔ)言操作Mysql數(shù)據(jù)庫(kù),主要就是為了實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)的增、刪、改、查等操作,下面這篇文章主要給大家介紹了關(guān)于MySQL系列教程之使用C語(yǔ)言來(lái)連接數(shù)據(jù)庫(kù)的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-09-09
  • VScode配置C++運(yùn)行環(huán)境的完整步驟

    VScode配置C++運(yùn)行環(huán)境的完整步驟

    這篇文章主要給大家介紹了關(guān)于VScode配置C++運(yùn)行環(huán)境的完整步驟,文中通過(guò)圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01

最新評(píng)論

绥中县| 渭源县| 安图县| 互助| 罗平县| 双流县| 通海县| 勐海县| 房山区| 璧山县| 利川市| 罗平县| 鲁山县| 连云港市| 万盛区| 阿图什市| 额尔古纳市| 永济市| 建昌县| 台北市| 和静县| 屏东县| 麻阳| 德保县| 三明市| 河池市| 馆陶县| 柯坪县| 仁怀市| 潮安县| 雷波县| 宁安市| 黔西县| 寻甸| 临澧县| 衡水市| 胶南市| 定结县| 沛县| 保康县| 运城市|