日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > c/c++ >内容正文

c/c++

【转载】c++之类的基本操作(c++ primer 的读书笔记 ,类对象, 类用户, 类成员的含义)

發(fā)布時(shí)間:2025/3/15 c/c++ 11 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【转载】c++之类的基本操作(c++ primer 的读书笔记 ,类对象, 类用户, 类成员的含义) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一前言

看c++ primer有一個(gè)地方看的云里霧里的,這么一段話

可以認(rèn)為 protected 訪問(wèn)標(biāo)號(hào)是 private 和 public 的混合:
? 像 private 成員一樣,protected 成員不能被類(lèi)的用戶訪問(wèn)。
? 像 public 成員一樣,protected 成員可被該類(lèi)的派生類(lèi)訪問(wèn)。
此外,protected 還有另一重要性質(zhì):
? 派生類(lèi)只能通過(guò)派生類(lèi)對(duì)象訪問(wèn)其基類(lèi)的 protected 成員,派生類(lèi)對(duì)其基類(lèi)類(lèi)型對(duì)象的 protected 成員沒(méi)有特殊訪問(wèn)權(quán)限


這里就完全看不明白了,freeeim可能是翻譯的問(wèn)題導(dǎo)致的,老外寫(xiě)的本來(lái)就有點(diǎn)繞,翻譯過(guò)來(lái)就更加繞,很難理解。

那么我們以下面的代碼為例子。大家先看看覺(jué)得那句話編譯會(huì)報(bào)錯(cuò)。

我之前寫(xiě)的代碼都是編譯錯(cuò)了之后,自己再去修改,而沒(méi)有特別仔細(xì)的去思考到底為什么定義為pubulic ,protected和private,總是到這里弄不清楚,稀里糊涂就過(guò)去了,為了弄清楚,敲了下面的代碼,編譯之后便一目了然了。

二分析代碼

先自己分析一下,然后后面在公布答案。


[cpp] view plaincopyprint?
  • class A??
  • {?
  • public:?
  • ??????? int set(A& a);?
  • ??????? int public_a_var;?
  • protected:?
  • ??????? int protected_a_var;?
  • private:?
  • ??????? int private_a_var;?
  • };?
  • ?
  • ?
  • int A::set(A &a)?
  • {?
  • ??????? protected_a_var = a.protected_a_var;?
  • ??????? private_a_var = a.private_a_var;?
  • ??????? public_a_var = a.public_a_var;?
  • }?
  • class B:A?
  • {?
  • ??????? public:?
  • ??????????????? int anotherset(A& a, B& b);?
  • ??????????????? int public_b_var;?
  • ??????? protected:?
  • ??????????????? int protected_b_var;?
  • private:?
  • ??????????????? int private_b_var;?
  • };?
  • ?
  • ?
  • int B::anotherset(A& a, B& b)?
  • {?
  • ??????? public_b_var = a.public_a_var ;?
  • ??????? public_b_var = b.public_b_var;?
  • ??????? protected_b_var = a.protected_a_var;?
  • ??????? protected_b_var = b.protected_b_var;?
  • ??????? private_b_var = a.private_a_var;?
  • ??????? private_b_var = b.private_b_var;?
  • ?
  • ?
  • ?
  • ?
  • ??????? public_a_var = a.public_a_var ;?
  • ??????? public_a_var = b.public_b_var;?
  • ??????? protected_a_var = a.protected_a_var;?
  • ??????? protected_a_var = b.protected_b_var;?
  • ??????? private_a_var = a.private_a_var;?
  • ??????? private_a_var = b.private_b_var;?
  • }?
  • ?
  • ?
  • int main()?
  • {?
  • ??????? A main_a;?
  • ??????? int a = main_a.private_a_var;?
  • ??????? int b = main_a.protected_a_var;?
  • ??????? int c = main_a.public_a_var;?
  • }?
  • class A { public:int set(A& a);int public_a_var; protected:int protected_a_var; private:int private_a_var; };int A::set(A &a) {protected_a_var = a.protected_a_var;private_a_var = a.private_a_var;public_a_var = a.public_a_var; } class B:A {public:int anotherset(A& a, B& b);int public_b_var;protected:int protected_b_var; private:int private_b_var; };int B::anotherset(A& a, B& b) {public_b_var = a.public_a_var ;public_b_var = b.public_b_var;protected_b_var = a.protected_a_var;protected_b_var = b.protected_b_var;private_b_var = a.private_a_var;private_b_var = b.private_b_var;public_a_var = a.public_a_var ;public_a_var = b.public_b_var;protected_a_var = a.protected_a_var;protected_a_var = b.protected_b_var;private_a_var = a.private_a_var;private_a_var = b.private_b_var; }int main() {A main_a;int a = main_a.private_a_var;int b = main_a.protected_a_var;int c = main_a.public_a_var; }


    三含義介紹

    1 類(lèi)成員的含義

    首先說(shuō)一下概念,c++ primer里面類(lèi)成員,類(lèi)對(duì)象,類(lèi)用戶,這些詞語(yǔ)在c++ primer里面用的亂七八糟的,讓人看著很費(fèi)解,如果你本身又是學(xué)過(guò)別的c++的書(shū)籍,看到上面的一段話估計(jì)要崩潰的,講的是嘛啊?

    2 類(lèi)對(duì)象的含義

    先解釋一下上面這句話:

    這里類(lèi)成員這個(gè)詞沒(méi)有任何歧義,就是指類(lèi)里面的所有變量和函數(shù)。

    類(lèi)對(duì)象這個(gè)詞存在歧義,而且這本書(shū)里面前后都不一樣,要看語(yǔ)境了。

    第一種是廣義的

    比如上文中的,main函數(shù)里面的main_a ,set函數(shù)里面的a,anotherset函數(shù)里面的a, b 都是類(lèi)對(duì)象,而且這本書(shū)里面的大部分地方類(lèi)對(duì)象就是廣義的。

    第二種是狹義的,專(zhuān)指類(lèi)的成員函數(shù)里面的作為參數(shù)的類(lèi)對(duì)象。

    在某些語(yǔ)境里面,個(gè)人覺(jué)得一般是出現(xiàn)了類(lèi)的用戶這個(gè)詞之后,類(lèi)對(duì)象就變成狹義了。

    上面那句話里面“派生類(lèi)只能通過(guò)派生類(lèi)對(duì)象訪問(wèn)其基類(lèi)的 protected 成員”,

    其實(shí)這里可以這么理解吧,派生類(lèi)的進(jìn)行什么操作,描述的就是類(lèi)的函數(shù)了,前面加入了條件限制了,那么這個(gè)類(lèi)對(duì)象自然就也被限定了起來(lái)。

    不過(guò)讀起來(lái)就很費(fèi)勁了。


    3 類(lèi)的用戶

    這個(gè)詞語(yǔ)在一般的c++書(shū)上貌似是看不到的,突然之間冒出來(lái)一個(gè)類(lèi)的用戶,就突然感覺(jué)復(fù)雜了很多。

    其實(shí)如果第一句話修改為:

    像 private 成員一樣,protected 成員不能被類(lèi)的對(duì)象訪問(wèn)。

    這個(gè)時(shí)候,你在看第三句話,就會(huì)有疑問(wèn),既然protect成員不能被類(lèi)的對(duì)象訪問(wèn),那怎么又派生類(lèi)只能通過(guò)派生類(lèi)對(duì)象訪問(wèn)其基類(lèi)的 protected 成員”,這不是前后矛盾么?

    其實(shí)并不矛盾,作者也是怕用戶看到這里看糊涂了,就引入了類(lèi)的用戶。

    類(lèi)的用戶,可以專(zhuān)門(mén)指外部函數(shù)里面的類(lèi)的對(duì)象,例如main函數(shù)里面的main_a ,其他幾個(gè)就不是類(lèi)的用戶了。


    四進(jìn)一步分析

    我們分析一下上面的這一段話,其實(shí)有一個(gè)前提,沒(méi)說(shuō)說(shuō)明白。

    因?yàn)樽髡哒J(rèn)為大部分人都應(yīng)該知道,所以就沒(méi)有說(shuō),也沒(méi)有強(qiáng)調(diào),但是很多人都是半生不熟的c++然后來(lái)看這本書(shū),知道它是經(jīng)典,但是不知道它不是prime,至少你得寫(xiě)了一年的c++代碼,至少你得吃過(guò)苦頭才能明白。

    廢話不說(shuō)了,前提是:

    類(lèi)的成員函數(shù)中的類(lèi)對(duì)象,可以訪問(wèn)自己的所有類(lèi)型的成員。

    換句話說(shuō),狹義的類(lèi)對(duì)象,可以訪問(wèn)自己的所有類(lèi)型的成員。

    類(lèi)的成員函數(shù)中其實(shí)是個(gè)定語(yǔ),雖然很長(zhǎng)。

    第三句話的前半段,“派生類(lèi)只能通過(guò)派生類(lèi)對(duì)象訪問(wèn)其基類(lèi)的 protected 成員”,因?yàn)榕缮?lèi)已經(jīng)繼承了基類(lèi),所以protected也是它自己的成員,基于這個(gè)前提,它狹義的類(lèi)對(duì)象,自然可以訪問(wèn)自己的protected變量。

    第三局話的后半段,當(dāng)基類(lèi)對(duì)象作為參數(shù)的時(shí)候,這句話更繞,我們用繼承類(lèi)代替前面那句話的類(lèi),就是由于基類(lèi)對(duì)象不屬于繼承類(lèi)的成員函數(shù)的繼承類(lèi)對(duì)象,所以它本質(zhì)上不屬于這個(gè)繼承類(lèi)的對(duì)象,所以它的權(quán)限就和類(lèi)的用戶是一樣的。


    五分析代碼

    上面已經(jīng)把人說(shuō)暈了,我分析下代碼吧。

    [cpp] view plaincopyprint?
  • int A::set(A &a)?
  • {?
  • ??????? protected_a_var = a.protected_a_var;?
  • ??????? private_a_var = a.private_a_var;?
  • ??????? public_a_var = a.public_a_var;?
  • }?
  • int A::set(A &a) {protected_a_var = a.protected_a_var;private_a_var = a.private_a_var;public_a_var = a.public_a_var; }

    這三句話都正確。

    這里有兩個(gè)概念,protected_a_var ,private_a_var已經(jīng)public_a_var實(shí)質(zhì)是this.開(kāi)頭的,指的是類(lèi)的成員(其實(shí)也是類(lèi)當(dāng)前對(duì)象的成員),入?yún)⑹穷?lèi)型A的對(duì)象a,由于類(lèi)型一樣,所以可以操作a的任何變量。

    這個(gè)原理我不知道,面向?qū)ο蟮乃枷氚?#xff0c;其實(shí)面向?qū)ο缶褪欠抡杖祟?lèi)社會(huì)。我們可以這么理解如果大家是一類(lèi),或者看成一家人,在構(gòu)建這個(gè)家庭的時(shí)候,我們內(nèi)部的各種東西都是共享的。

    但是當(dāng)我們出了這個(gè)家門(mén),在外面的時(shí)候,只有我們家公共的信息可以告訴別人,但是私有的密碼,必然家里多少錢(qián),銀行密碼之類(lèi)的就不能說(shuō)了。

    [cpp] view plaincopyprint?
  • int B::anotherset(A& a, B& b)?
  • {?
  • ??????? public_b_var = a.public_a_var ;?
  • ??????? public_b_var = b.public_b_var;?
  • ??????? protected_b_var = a.protected_a_var;?
  • ??????? protected_b_var = b.protected_b_var;?
  • ??????? private_b_var = a.private_a_var;?
  • ??????? private_b_var = b.private_b_var;?
  • ?
  • ?
  • ?
  • ?
  • ??????? public_a_var = a.public_a_var ;?
  • ??????? public_a_var = b.public_b_var;?
  • ??????? protected_a_var = a.protected_a_var;?
  • ??????? protected_a_var = b.protected_b_var;?
  • ??????? private_a_var = a.private_a_var;?
  • ??????? private_a_var = b.private_b_var;?
  • }?
  • int B::anotherset(A& a, B& b) {public_b_var = a.public_a_var ;public_b_var = b.public_b_var;protected_b_var = a.protected_a_var;protected_b_var = b.protected_b_var;private_b_var = a.private_a_var;private_b_var = b.private_b_var;public_a_var = a.public_a_var ;public_a_var = b.public_b_var;protected_a_var = a.protected_a_var;protected_a_var = b.protected_b_var;private_a_var = a.private_a_var;private_a_var = b.private_b_var; }

    看看這段代碼,繼承其實(shí)就像分家了,我們有一些共有的東西,也有一些私有的東西,但是也不是特別的貼切這個(gè)比喻。這樣吧,就像娶老婆了。老婆說(shuō),你的都是我的,我的還是我的。其實(shí)都不貼切,如果大家看過(guò)龍珠的話,可以這么認(rèn)為,就像是那美克星人的生殖,兒子繼承類(lèi)父親的所有能力,而且自己還會(huì)不斷進(jìn)步。

    廢話不說(shuō)了,我們還是分析加上必要的記憶吧。

    先看前六句:

    我們根據(jù)上面的理解,賦值語(yǔ)句前面的變量,class B都可以訪問(wèn),后面的如果類(lèi)型是class B的因?yàn)槭且患胰硕伎梢栽L問(wèn),a 的只能訪問(wèn)public類(lèi)型的,所以結(jié)果為

    [cpp] view plaincopyprint?
  • ????????????? public_b_var = a.public_a_var ;?
  • public_b_var = b.public_b_var;?
  • protected_b_var = a.protected_a_var;//錯(cuò)誤,a.protected_a_var是保護(hù)的。?
  • protected_b_var = b.protected_b_var;?
  • private_b_var = a.private_a_var;//錯(cuò)誤,a.private_a_var是私有的?
  • private_b_var = b.private_b_var;?
  • public_b_var = a.public_a_var ;public_b_var = b.public_b_var;protected_b_var = a.protected_a_var;//錯(cuò)誤,a.protected_a_var是保護(hù)的。protected_b_var = b.protected_b_var;private_b_var = a.private_a_var;//錯(cuò)誤,a.private_a_var是私有的private_b_var = b.private_b_var;

    下面六句話,繼承的時(shí)候,繼承類(lèi)的成員只能訪問(wèn)protect和pirvate所以結(jié)果如下

    [cpp] view plaincopyprint?
  • ????????????? public_a_var = a.public_a_var ;?
  • public_a_var = b.public_b_var;?
  • protected_a_var = a.protected_a_var;//錯(cuò)誤,a.protected_a_var是保護(hù)的。?
  • protected_a_var = b.protected_b_var;?
  • private_a_var = a.private_a_var;// 兩個(gè)錯(cuò)誤,private_a_var 和a.private_a_var都不能訪問(wèn),是私有的?
  • private_a_var = b.private_b_var;//private_a_var是私有的,賦值語(yǔ)句前面的那個(gè)?
  • public_a_var = a.public_a_var ;public_a_var = b.public_b_var;protected_a_var = a.protected_a_var;//錯(cuò)誤,a.protected_a_var是保護(hù)的。protected_a_var = b.protected_b_var;private_a_var = a.private_a_var;// 兩個(gè)錯(cuò)誤,private_a_var 和a.private_a_var都不能訪問(wèn),是私有的private_a_var = b.private_b_var;//private_a_var是私有的,賦值語(yǔ)句前面的那個(gè)

    最后分析main函數(shù)里面的


    [cpp] view plaincopyprint?
  • int a = main_a.private_a_var;//錯(cuò)誤,a.private的私有?
  • int b = main_a.protect_a_var;//錯(cuò)誤,a.protect是保護(hù)?
  • int c = main_a.public_a_var;?
  • int a = main_a.private_a_var;//錯(cuò)誤,a.private的私有int b = main_a.protect_a_var;//錯(cuò)誤,a.protect是保護(hù)int c = main_a.public_a_var;

    6 結(jié)果。

    大家可以編譯測(cè)試一下:上面文章有原因,本來(lái)想標(biāo)記為紅色,但是代碼類(lèi)型的不會(huì)標(biāo)記,如果有達(dá)人知道,希望在評(píng)論里面回復(fù)一下,便于大家查看代碼。

    [cpp] view plaincopyprint?
  • <span style="font-size: 14px;">class A??
  • {?
  • public:?
  • ??????? int set(A& a);?
  • ??????? int public_a_var;?
  • protected:?
  • ??????? int protected_a_var;?
  • private:?
  • ??????? int private_a_var;?
  • };?
  • ?
  • ?
  • int A::set(A &a)?
  • {?
  • ??????? protected_a_var = a.protected_a_var;?
  • ??????? private_a_var = a.private_a_var;?
  • ??????? public_a_var = a.public_a_var;?
  • }?
  • class B:A?
  • {?
  • ??????? public:?
  • ??????????????? int anotherset(A& a, B& b);?
  • ??????????????? int public_b_var;?
  • ??????? protected:?
  • ??????????????? int protected_b_var;?
  • private:?
  • ??????????????? int private_b_var;?
  • };?
  • ?
  • ?
  • int B::anotherset(A& a, B& b)?
  • {?
  • ??????? public_b_var = a.public_a_var ;?
  • ??????? public_b_var = b.public_b_var;?
  • ??????? protected_b_var = a.protected_a_var;//error?
  • ??????? protected_b_var = b.protected_b_var;?
  • ??????? private_b_var = a.private_a_var;//error?
  • ??????? private_b_var = b.private_b_var;?
  • ?
  • ?
  • ?
  • ?
  • ??????? public_a_var = a.public_a_var ;?
  • ??????? public_a_var = b.public_b_var;?
  • ??????? protected_a_var = a.protected_a_var;//error?
  • ??????? protected_a_var = b.protected_b_var;?
  • ??????? private_a_var = a.private_a_var;//error?
  • ??????? private_a_var = b.private_b_var;//error?
  • }?
  • ?
  • ?
  • int main()?
  • {?
  • ??????? A main_a;?
  • ??????????????? int a = main_a.private_a_var;//error?
  • ??????? int b = main_a.protected_a_var;//error?
  • ??????? int c = main_a.public_a_var;?
  • }</span>?
  • class A { public:int set(A& a);int public_a_var; protected:int protected_a_var; private:int private_a_var; };int A::set(A &a) {protected_a_var = a.protected_a_var;private_a_var = a.private_a_var;public_a_var = a.public_a_var; } class B:A {public:int anotherset(A& a, B& b);int public_b_var;protected:int protected_b_var; private:int private_b_var; };int B::anotherset(A& a, B& b) {public_b_var = a.public_a_var ;public_b_var = b.public_b_var;protected_b_var = a.protected_a_var;//errorprotected_b_var = b.protected_b_var;private_b_var = a.private_a_var;//errorprivate_b_var = b.private_b_var;public_a_var = a.public_a_var ;public_a_var = b.public_b_var;protected_a_var = a.protected_a_var;//errorprotected_a_var = b.protected_b_var;private_a_var = a.private_a_var;//errorprivate_a_var = b.private_b_var;//error }int main() {A main_a;int a = main_a.private_a_var;//errorint b = main_a.protected_a_var;//errorint c = main_a.public_a_var; }


    總結(jié)

    以上是生活随笔為你收集整理的【转载】c++之类的基本操作(c++ primer 的读书笔记 ,类对象, 类用户, 类成员的含义)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 不卡中文一二三区 | 在线视频在线观看 | 欧美大片一级 | 懂色av一区二区三区免费 | 先锋影音av在线资源 | 亚洲欧美一区二区视频 | 色wwwwww| 国产高清免费在线播放 | 一级的大片 | 天天操天天射天天 | 午夜精品久久99蜜桃的功能介绍 | 久久国产一级 | 成年人午夜 | 欧美成人国产 | 亚洲永久无码精品一区二区 | 亚洲成人av一区二区三区 | 奇米影 | 午夜男人影院 | 91操碰| 亚欧日韩av | 一级黄色影院 | 永久免费看成人av的动态图 | 午夜精品一区二区三区在线视频 | 欧美亚洲国产另类 | 国产无遮挡aaa片爽爽 | av色图片| 在线免费观看视频黄 | 久久看av | 超碰97在线免费 | 久草视频观看 | 午夜精品视频一区二区三区在线看 | 天堂亚洲| 黄色免费小视频 | 欧美人与性禽动交精品 | 精品一区二区三区久久 | 国语av | 久久窝窝| 欧美做爰性生交视频 | 日韩精品一区二区免费视频 | 大桥未久恸哭の女教师 | 免费看黄色漫画 | 日韩精品视频在线观看免费 | 色综合天 | 激情综合av | 中文字幕在线网址 | www超碰在线| 小泽玛丽亚在线观看 | 激情综合五月网 | 大奶在线播放 | 精品中文字幕一区二区 | 99热这里只有精品1 亚洲人交配视频 | 91成人动漫 | 国产女人爽到高潮a毛片 | 亚洲第一大网站 | 精品国产乱码久久久久久1区2区 | 精品在线免费观看 | 黄色片视频免费看 | 日本做受| 欧美国产一区二区三区 | 性欧美另类 | 色中文字幕在线观看 | 欧美日韩一区二区精品 | 一本色道久久hezyo无码 | 精品三级视频 | 亚洲精品网站在线观看 | 这里只有精品久久 | 日韩欧美在线精品 | 成人午夜淫片免费观看 | 日韩成人精品一区二区 | 久久久精品免费视频 | 一区二区三区四区视频 | av在线首页| 欧美无砖区 | 国产精品久久久久久久av | 台湾性生生活1 | 国产精品电影一区二区三区 | 一本一道久久a久久精品蜜桃 | 在线观看av片 | wwwxxx欧美| 涩涩网站在线观看 | 日本美女性生活视频 | 亚洲一区二区三区四区av | 成人综合网址 | 久草免费在线色站 | 99日精品 | 天堂亚洲| 美女扒开腿让男人 | 国产巨乳在线观看 | 一级黄在线观看 | 精品一久久 | 日韩精品免费一区 | 人妻久久久一区二区三区 | 国内自拍欧美 | 日韩av电影一区 | 久久久嫩草 | 四川操bbb | 明日花绮罗高潮无打码 | 一区二区三区视频免费看 | 91麻豆精品国产91久久久久久久久 |