【C++類和數據抽象】類的作用域

目錄

一、類的作用域基本概念

1.1 什么是類的作用域

1.2?作用域層次體系

1.3?類作用域的特點

1.4?基本訪問規則

二、訪問控制三劍客

2.1 public:開放接口

2.2 private:數據封裝?

2.3 protected:繼承通道

2.4?跨作用域訪問示例?

三、類作用域中的成員查找規則

3.1 基本查找規則

3.2 示例代碼

3.3 靜態成員的特殊作用域

四、在類的外部訪問類的成員

4.1 通過對象訪問

4.2 通過類名訪問靜態成員

五、嵌套類

5.1 嵌套類的定義

5.2 嵌套類的訪問權限

5.3 嵌套類的作用

六、局部類

6.1 局部類的定義

6.2 局部類的特點

6.3 局部類的用途

七、類作用域與繼承

7.1 基類和派生類的作用域關系

7.2 作用域解析運算符在繼承中的應用

八、友元與作用域突破

8.1 友元函數

8.2 友元類

九、作用域解析運算符(::)

9.1 解決命名沖突

9.2 全局作用域訪問??

十、總結

十一、參考資料


在 C++ 編程中,作用域是一個非常重要的概念,它決定了標識符(如變量、函數、類等)的可見性和生命周期。類的作用域是一種特殊的作用域,它為類的成員(包括成員變量和成員函數)提供了一個獨立的命名空間。理解類的作用域對于正確使用類和避免命名沖突至關重要。

一、類的作用域基本概念

1.1 什么是類的作用域

類的作用域是指類定義的大括號內的范圍。在這個范圍內,類的成員(成員變量和成員函數)具有特定的可見性和訪問規則。類的作用域為類的成員提供了一個獨立的命名空間,使得不同類的成員可以使用相同的名稱而不會產生命名沖突。例如,有兩個類ClassAClassB,它們都可以有一個名為func的成員函數,因為它們處于不同的類作用域中。

1.2?作用域層次體系

C++作用域分為六個層級:

作用域類型可見范圍生命周期
全局作用域整個程序程序運行期間
命名空間作用域命名空間內部程序運行期間
類作用域類定義內部類存在期間
局部作用域函數/代碼塊內部代碼塊執行期間
語句作用域控制語句內部(如for循環)語句執行期間
函數參數作用域函數參數列表函數調用期間

1.3?類作用域的特點

  • 成員的可見性:類的成員在類的作用域內是可見的,但在類的外部通常需要通過對象或類名來訪問。
  • 嵌套作用域:類的作用域可以嵌套,例如類中可以定義嵌套類,嵌套類有自己獨立的作用域。
  • 命名空間隔離:類的作用域將類的成員與外部作用域的標識符隔離開來,減少了命名沖突的可能性。

1.4?基本訪問規則

class MyClass {int privateVar;       // 類作用域內可見static const int MAX = 100; // 類作用域常量
public:void publicMethod() {privateVar = 42;  // 允許訪問同類的私有成員}
};int main() {MyClass obj;obj.publicMethod();   // 正確:通過對象訪問公有方法// obj.privateVar = 5; // 錯誤:私有成員不可外部訪問return 0;
}

二、訪問控制三劍客

2.1 public:開放接口

class API {
public:void openInterface() { /*...*/ }  // 對外開放的服務接口
};

2.2 private:數據封裝?

class BankAccount {double balance;       // 私有數據成員
public:void deposit(double amount) {balance += amount; // 內部操作私有數據}
};

2.3 protected:繼承通道

class Vehicle {
protected:int speed;            // 受保護成員
};class Car : public Vehicle {
public:void accelerate() {speed += 10;      // 派生類可訪問protected成員}
};

2.4?跨作用域訪問示例?

class AccessControl {
public:int publicVar;protected:int protectedVar;private:int privateVar;
};class Derived : public AccessControl {void accessDemo() {publicVar = 1;      // ?protectedVar = 2;   // ?// privateVar = 3;  // ?}
};void externalAccess() {AccessControl obj;obj.publicVar = 1;      // ?// obj.protectedVar = 2;// ?// obj.privateVar = 3;  // ?
}

三、類作用域中的成員查找規則

3.1 基本查找規則

當在類的成員函數中使用一個標識符時,編譯器會按照以下順序進行查找:

  • 首先在當前成員函數的局部作用域中查找該標識符。
  • 如果在局部作用域中沒有找到,則在類的作用域中查找,即查找類的成員變量和成員函數。
  • 如果在類的作用域中也沒有找到,則在包含該類定義的外部作用域中查找。

3.2 示例代碼

#include <iostream>
using namespace std;int x = 10;class MyClass {
private:int x = 20;
public:void func() {int x = 30;cout << "Local x: " << x << endl;  // 輸出局部變量x的值30cout << "Class member x: " << this->x << endl;  // 輸出類成員變量x的值20cout << "Global x: " << ::x << endl;  // 輸出全局變量x的值10}
};int main() {MyClass obj;obj.func();return 0;
}

func函數內部有一個局部變量x,類MyClass有一個成員變量x,同時還有一個全局變量x。通過不同的訪問方式,可以分別訪問到這三個不同作用域的x

3.3 靜態成員的特殊作用域

①靜態成員特性

  • 類級別而非對象級別
  • 通過類名直接訪問
  • 內存中僅存在一份副本

② 代碼示例

class Counter {
public:static int count;     // 聲明靜態成員Counter() { count++; }
};int Counter::count = 0;   // 定義靜態成員int main() {Counter a, b;cout << a.count;      // 輸出2(通過對象訪問)cout << Counter::count; // 輸出2(通過類名訪問)
}

③靜態函數限制

  • 只能訪問靜態成員變量
  • 不能使用this指針
  • 常用于工具函數或工廠方法

四、在類的外部訪問類的成員

4.1 通過對象訪問

對于非靜態成員變量和成員函數,可以通過類的對象來訪問。例如:

#include <iostream>
using namespace std;class Rectangle {
private:int width;int height;
public:Rectangle(int w, int h) : width(w), height(h) {}int getArea() {return width * height;}
};int main() {Rectangle rect(5, 3);cout << "Area: " << rect.getArea() << endl;return 0;
}

通過rect對象調用getArea成員函數來計算矩形的面積。

4.2 通過類名訪問靜態成員

對于靜態成員變量和成員函數,可以通過類名直接訪問,不需要創建對象。例如:?

#include <iostream>
using namespace std;class Counter {
public:static int count;static void increment() {count++;}
};int Counter::count = 0;int main() {Counter::increment();cout << "Count: " << Counter::count << endl;return 0;
}

通過Counter類名直接調用increment靜態成員函數,并訪問count靜態成員變量。

五、嵌套類

5.1 嵌套類的定義

嵌套類是指在一個類的內部定義的另一個類。嵌套類的作用域被包含在外部類的作用域內。例如:?

#include <iostream>
using namespace std;class OuterClass {
private:int outerData;
public:OuterClass(int data) : outerData(data) {}class InnerClass {private:int innerData;public:InnerClass(int data) : innerData(data) {}void display() {cout << "Inner data: " << innerData << endl;}};void createInner() {InnerClass inner(10);inner.display();}
};int main() {OuterClass outer(20);outer.createInner();return 0;
}

InnerClassOuterClass的嵌套類。

5.2 嵌套類的訪問權限

嵌套類可以訪問外部類的靜態成員,但通常不能直接訪問外部類的非靜態成員。外部類對嵌套類的成員的訪問也受到嵌套類的訪問控制規則的限制。

5.3 嵌套類的作用

嵌套類可以用于將相關的類組織在一起,提高代碼的可讀性和可維護性。同時,嵌套類可以隱藏一些實現細節,只向外部暴露必要的接口。

六、局部類

6.1 局部類的定義

局部類是指在函數內部定義的類。局部類的作用域僅限于定義它的函數內部。例如:?

#include <iostream>
using namespace std;void func() {class LocalClass {private:int data;public:LocalClass(int d) : data(d) {}void display() {cout << "Local class data: " << data << endl;}};LocalClass obj(5);obj.display();
}int main() {func();return 0;
}

LocalClass是在func函數內部定義的局部類。

6.2 局部類的特點

  • 作用域限制:局部類只能在定義它的函數內部使用,不能在函數外部訪問。
  • 成員限制:局部類只能訪問函數的靜態變量和全局變量,不能訪問函數的非靜態局部變量。

6.3 局部類的用途

局部類可以用于實現一些只在特定函數內部使用的功能,避免在全局作用域中引入不必要的類定義,提高代碼的封裝性。

七、類作用域與繼承

7.1 基類和派生類的作用域關系

在繼承關系中,派生類的作用域嵌套在基類的作用域之上。派生類可以訪問基類的公共和受保護成員,同時可以定義自己的成員。當派生類和基類有同名的成員時,派生類的成員會隱藏基類的成員。例如:?

#include <iostream>
using namespace std;class Base {
public:void func() {cout << "Base class func" << endl;}
};class Derived : public Base {
public:void func() {cout << "Derived class func" << endl;}
};int main() {Derived d;d.func();  // 調用派生類的func函數d.Base::func();  // 調用基類的func函數return 0;
}

Derived類和Base類都有一個名為func的成員函數,通過不同的調用方式可以分別調用派生類和基類的func函數。

7.2 作用域解析運算符在繼承中的應用

作用域解析運算符::可以用于明確指定要訪問的是基類的成員還是派生類的成員,避免成員隱藏帶來的混淆。

八、友元與作用域突破

8.1 友元函數

class Secret {int code;friend void crackCode(Secret& s); // 聲明友元
};void crackCode(Secret& s) {s.code = 42;  // 友元函數可訪問私有成員
}

8.2 友元類

class Safe {int password;friend class Hacker;
};class Hacker {
public:void steal(Safe& s) {s.password = 123456; // 友元類訪問私有成員}
};

九、作用域解析運算符(::)

9.1 解決命名沖突

class File {
public:int size;void print(int size) {cout << "File size: " << File::size; // 明確訪問類成員cout << "Local size: " << size;      // 參數變量}
};

9.2 全局作用域訪問??

int globalVar = 100;class ScopeTest {
public:void show() {int globalVar = 200;cout << ::globalVar; // 輸出100(訪問全局變量)}
};

十、總結

類的作用域是 C++ 中一個重要的概念,它為類的成員提供了獨立的命名空間,決定了成員的可見性和訪問規則。理解類的作用域的基本概念、成員查找規則、嵌套類和局部類的使用,以及類作用域在繼承中的應用,對于編寫高質量的 C++ 代碼至關重要。通過合理利用類的作用域,可以提高代碼的可讀性、可維護性和封裝性,避免命名沖突和意外的訪問錯誤。

十一、參考資料

  • ?《C++ Primer(第 5 版)》這本書是 C++ 領域的經典之作,對 C++ 的基礎語法和高級特性都有深入講解。
  • 《Effective C++(第 3 版)》書中包含了很多 C++ 編程的實用建議和最佳實踐。
  • 《C++ Templates: The Complete Guide(第 2 版)》該書聚焦于 C++ 模板編程,而using聲明在模板編程中有著重要應用,如定義模板類型別名等。
  • C++ 官方標準文檔:C++ 標準文檔是最權威的參考資料,可以查閱最新的 C++ 標準(如 C++11、C++14、C++17、C++20 等)文檔。例如,ISO/IEC 14882:2020 是 C++20 標準的文檔,可從相關渠道獲取其詳細內容。
  • :這是一個非常全面的 C++ 在線參考網站,提供了詳細的 C++ 語言和標準庫文檔。
  • :該網站提供了系統的 C++ 教程,配有豐富的示例代碼和清晰的解釋,適合初學者學習和理解相關知識。
  • 《C++標準庫(第2版)》Nicolai M. Josuttis 著

  • Effective STL Scott Meyers 著

  • C++ Core Guidelines:C++ Core Guidelines

  • C++ Reference:https://en.cppreference.com/w/


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/79888.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/79888.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/79888.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

opencv圖片顏色識別,顏色的替換

圖片顏色識別 1. RGB顏色空間2. 顏色加法2.1使用numpy對圖像進行加法2.2使用opencv加法&#xff08;cv2.add&#xff09; 3 顏色加權加法&#xff08;cv2.addWeighted()&#xff09;4. HSV顏色空間5. 制作掩膜4. 與運算&#xff08;cv2.bitwise_and&#xff09;5.顏色的替換7 R…

ADC數據不穩定的解決方案

問題如圖&#xff1a; 解決方案&#xff1a;上圖第一個通道后來接入GND&#xff0c;就穩定了 上圖第一個通道后來接入VCC&#xff0c;就穩定了

Spark(18)Yarn-概述

Hadoop三大核心組件&#xff1a;HDFS、MapReduce和YARN 一&#xff09;Yarn的概念 YARN(Yet Another Resource Negotiator,另一種資源協調者)是一個通用資源管理系統和調度平臺&#xff0c;可為上層應用提供統一的資源管理和調度。它的引入為集群在利用率&#xff0c;資源統一管…

Flowith AI,解鎖下一代「知識交易市場」

前言 最近幾周自媒體號都在瘋狂推Manus&#xff0c;看了幾篇測評后&#xff0c;突然在某個時間節點&#xff0c;在特工的文章下&#xff0c;發現了很小眾的Flowith。 被這段評論給心動到&#xff0c;于是先去注冊了下賬號。一翻探索過后&#xff0c;發現比我想象中要有趣的多&…

Maxscript調用Newtonsoft.Json解析Json

Maxscript調用Newtonsoft.Json解析Json_newtonsoft.json maxscript-CSDN博客

搭建用友U9Cloud ERP及UAP IDE環境

應用環境 Microsoft Windows 10.0.19045.5487 x64 專業工作站版 22H2Internet Information Services - 10.0.19041.4522Microsoft SQL Server 2019 - 15.0.2130.3 (X64)Microsoft SQL Server Reporing Services 2019 - 15.0.9218.715SQL Server Management Studio -18.6 laster…

github新建一個遠程倉庫并添加了README.md,本地git倉庫無法push

1.本地git倉庫與遠程倉庫綁定 2.push時報錯&#xff0c;本地的 main 分支落后于遠程倉庫的 main 分支&#xff08;即遠程有更新&#xff0c;但你本地沒有&#xff09;&#xff0c;需要拉取遠程的倉庫--->在merge合并&#xff08;解決沖突&#xff09;--->push 3.但是git …

我用deepseek做了一個提取壓縮文件夾下pdf和word文件工具

由于最近需要把大量的壓縮文件的pdf和word文件統一復制到一個文件夾中。 我們一般正常操作方式的是把一個壓縮文件一個一個解壓&#xff0c;然后在把一個的解壓好的文件夾下文件復制到另外一個文件夾中。 這個也需太繁瑣了&#xff0c;從以往統計的需要花費兩個小時間&#x…

企業網絡安全合規風險高、運營不穩定,要怎么解決?

在數字化浪潮中&#xff0c;數據已然成為企業的核心資產&#xff0c;其重要性不言而喻。然而&#xff0c;數據泄露風險也時刻威脅著企業的生存與發展。不少企業在歷經數據泄露的慘痛教訓后&#xff0c;紛紛選擇部署數據防泄露系統。那么&#xff0c;企業部署數據防泄露系統前后…

C#—Lazy<T> 類型(延遲初始化/懶加載模式)

C# 的 Lazy<T> 類型 Lazy<T> 是 C# 中的一個類&#xff0c;用于實現延遲初始化&#xff08;懶加載&#xff09;模式。它提供了一種線程安全的方式來延遲創建大型或資源密集型對象&#xff0c;直到第一次實際需要時才進行初始化。 主要特點 延遲初始化&#xff1a…

C++之unordered封裝

目錄 一、哈希表的修改 1.1、哈希表節點結構 1.2、迭代器 1.3、哈希表結構 1.4、完整代碼 二、unordered_map的實現 二、unordered_set的實現 一、哈希表的修改 注意&#xff1a;這里我們使用哈希桶來封裝unordered_map和unordered_set。 1.1、哈希表節點結構 templa…

[滲透測試]滲透測試靶場docker搭建 — —全集

[滲透測試]滲透測試靶場docker搭建 — —全集 對于初學者來說&#xff0c;僅僅了解漏洞原理是不夠的&#xff0c;還需要進行實操。對于公網上的服務我們肯定不能輕易驗證某些漏洞&#xff0c;否則可能觸犯法律。這是就需要用到靶場。 本文主要給大家介紹幾種常見漏洞對應的靶場…

Docker如何更換鏡像源提高拉取速度

在國內&#xff0c;由于網絡政策和限制&#xff0c;直接訪問DockerHub速度很慢&#xff0c;尤其是在拉取大型鏡像時。為了解決這個問題&#xff0c;常用的方法就是更換鏡像源。本文將詳細介紹如何更換Docker鏡像源&#xff0c;并提供當前可用的鏡像源。 換源方法 方法1&#x…

第一篇:從哲學到管理——實踐論與矛盾論如何重塑企業思維

引言&#xff1a;當革命哲學照亮現代商業 1937年&#xff0c;毛澤東在戰火中寫就的《實踐論》《矛盾論》&#xff0c;為中國共產黨提供了認識世界的方法論。今天&#xff0c;這兩部著作正成為企業破解管理困局的“思維操作系統”&#xff1a; 戰略模糊&#xff1a;據Gartner統…

云原生--基礎篇-2--云計算概述(云計算是云原生的基礎,IaaS、PaaS和SaaS服務模型)

1、云計算概念 云計算是一種通過互聯網提供計算資源&#xff08;包括服務器、存儲、數據庫、網絡、軟件等&#xff09;和服務的技術模式。用戶無需擁有和維護物理硬件&#xff0c;而是可以根據需要租用這些資源&#xff0c;并按使用量付費。 2、云計算特點 &#xff08;1&am…

一級濾波器設計:IL_cmdm > 80dB

目錄 背景 目的 操作 仿真測試 搭建仿真模型 插入損耗測試 優化設計后重新測試 思考 背景 在選購共模電感時&#xff0c;規格書中通常會提供插損曲線或者阻抗-頻率曲線&#xff0c;但這些數據都是在特定條件下測試獲得的。如果將其集中在我們的樣機中性能會如何&#…

qt 配置 mysql 驅動問題:Cannot load library qsqlmysql;QMYSQL driver not loaded

項目場景&#xff1a; 環境版本&#xff1a; qt &#xff1a;5.14.2 mysql&#xff1a;8.0 windows&#xff1a;10 提示&#xff1a;qt 配置 mysql 驅動&#xff1a; 項目場景&#xff1a;qt 配置 mysql 驅動 問題描述 提示&#xff1a;這里描述項目中遇到的問題&#xff1a;…

Kubernetes相關的名詞解釋Container(16)

什么是Container&#xff1f; 在 Kubernetes 中&#xff0c;Container&#xff08;容器&#xff09; 是一個核心概念&#xff0c;你可以將鏡像&#xff08;Image&#xff09;類比為程序的“源代碼”&#xff0c;而容器是這段“代碼”運行時的進程。例如&#xff0c;一個 nginx…

學習設計模式《四》——單例模式

一、基礎概念 單例模式的本質【控制實例數目】&#xff1b; 單例模式的定義&#xff1a;是用來保證這個類在運行期間只會被創建一個類實例&#xff1b;單例模式還提供了一個全局唯一訪問這個類實例的訪問點&#xff08;即GetInstance方法&#xff09;單例模式只關心類實例的創建…

零基礎上手Python數據分析 (19):Matplotlib 高級圖表定制 - 精雕細琢,讓你的圖表脫穎而出!

寫在前面 —— 超越默認樣式,掌握 Matplotlib 精細控制,打造專業級可視化圖表 上一篇博客,我們學習了 Matplotlib 的基礎繪圖功能,掌握了如何繪制常見的折線圖、柱狀圖、散點圖和餅圖,并進行了基本的圖表元素定制,例如添加標題、標簽、圖例等。 這些基礎技能已經能讓我…