激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - C/C++ - C++ 數據共享與保護

C++ 數據共享與保護

2022-01-20 14:40AF_MAX C/C++

C++ 數據共享與保護的基本概念,包括標識符的作用域與可見性,對象生存期,類數據的共享,類共享數據的保護。本篇文章就介紹C++ 數據共享與保護,需要的朋友可以參考一下

1.作用域

作用域:一個標識符在程序正文中有效的區域。

函數原型(函數聲明)作用域

例如函數原型void Print(int a);,變量a的作用域為括號左右之間。

局部作用域

例如如下函數定義,變量a的作用域為大括號之間。

?
1
2
3
4
void Print(){
int a = 0;
std::cout << a << std::endl;
}

類作用域

X類的成員m具有類作用域(設其一個實例對象為x),以下是在不同環境下對m的訪問方法:

1.類內訪問:

直接通過標識符m訪問。

2.類外訪問:

普通成員通過x.m
類成員通過X::m
對象指針通過ptr->m

命名空間作用域

在XX命名空間中聲明的對象m,其作用域在命名空間之內。命名空間外想訪問該對象要以XX::m的方式進行。

?
1
2
3
4
5
6
7
8
9
namespace XX{  // 命名空間中聲明
 void Print();
}
 
XX::Print(){  // 命名空間外定義
 //Print函數的定義
}
 
XX::Print()  // 命名空間外使用

using語句可以簡化對命名空間內對象的訪問:

  • 1.使用using XX::Print;語句后,其后只需要通過Print就可以調用該函數對象。
  • 2.使用using namespace XX;語句后,其后只需要通過函數名就可以調用XX命名空間下的對象。

2.可見性

可見性:程序運行到某一點,能夠引用到的標識符,稱該標識符為可見的。
可見性隱藏規則:在多個具有包含關系的作用域聲明的同名標識符,外層標識符在內層不可見。
全局變量:可以被本程序所有對象或函數引用。

  • 在默認(全局)命名空間內聲明的對象為全局變量,默認本編譯單元內可以引用。
  • 通過關鍵詞extern聲明引用的全局變量為其他編譯單元中已經定義的全局變量。
  • 通過關鍵詞static聲明的全局變量只能在本編譯單元中使用,不能在其他編譯單元用extern聲明引用。

局部變量:只能在內部作用域內被引用

3.對象的生存期

生存期:從對象內存空間被分配到被釋放的期間。

靜態生存期:對象的生存期與程序的運行期相同。

  • 1.在命名空間內聲明的對象都具有靜態生存期。
  • 2.在局部作用域中用static關鍵詞聲明的對象具有靜態生存期,在對應局部作用域中具有可見性。

動態生存期:對象的生存期為聲明點到聲明點所在作用域的結束點之間。

4.類數據的共享

面向結構編程:

程序模塊:函數
數據共享方式:參數傳遞、全局變量

面向對象編程:

程序模塊:
數據共享方式:類的靜態成員(類內數據共享)、類的友元(類外數據共享)

類的靜態數據成員(類屬性):類變量由該類所有實例對象共享,用static修飾。
設X類的靜態成員為m,類的一個實例對象為x:

  • 類的靜態變量必須類內聲明,類外定義。
  • 在類的第一個實例對象初始化前初始化,在內存上只有一份副本。
  • 類外定義時通過X::m進行引用,定義后可以通過實例對象進行引用,如x.m。

類的靜態函數成員(類方法):主要是處理類屬性或者處理該類下多個實例對象的方法,用static修飾。
設X類的靜態函數為func,類的一個實例對象為x:

  • 可以直接訪問該類的靜態數據和函數成員,不能訪問非靜態成員。
  • 可以在類的第一個實例對象初始化前通過X::func進行調用。
  • 在實例對象初始化可以通過x.func調用,但是為了代碼的可讀性,不推薦這樣使用。
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
// 靜態成員案例
#include<iostream>
using namespace std;
 
 
class A {
public:
 static int s_count;  // 私有靜態數據成員聲明
 
 static void set_count(int i) { // 靜態方法定義
  s_count = i;
 }
 
 void UsingCount(){
  s_count++;
 }
 
};
 
 
int A::s_count = 0;  // 私有靜態數據成員類外定義(注意要在前面加上數據的類型說明符)
 
 
int main() {
 A::s_count;   // 通過類名調用
 A::set_count(11); // 對象初始化前通過靜態函數成員訪問
 
 A a1;
 a1.UsingCount();   // 通過普通函數成員修改靜態數據成員
 cout << a1.s_count << endl; // 通過對象訪問靜態數據成員
 
 A a2;
 a2.UsingCount();
 cout << a2.s_count << endl; // 如果輸出結果是13,則證明靜態數據成員是共享的
 
}

輸出結果:

12
13

友元關系:一個類主動聲明其他類或函數是他的友元,進而給他們提供本類的訪問特許,用friend修飾。
友元函數:被一個類聲明為友元的函數,在他的函數體內可以通過對象名訪問類的私有和保護成員。
友元類:被一個類A聲明為友元的另一個類B,類B內所有成員函數都是類A的友元函數。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
//友元數據共享案例
#include<iostream>
using namespace std;
 
 
class A {
private:
 int m_nums = 10;   // 私有數據成員
 
friend class B;    // 友元類聲明
};
 
 
class B { // 友元類
public:
 void Print(A& a) { // 友元函數
  cout << a.m_nums << endl; // 通過對象名訪問私有成員
 }
};
 
 
int main() {
 A a;
 B b;
 b.Print(a);   // 訪問私有數據成員
}

結果輸出:

10
1

5.類共享數據的保護

常對象:常對象的數據成員值在對象整個生存期間不能被更改。
設A類的常對象為a,常函數成員為func,常數據成員為m

  • 1. 聲明語法:const A a;
  • 2. 常對象必須進行初始化,而且不能被更新(不能賦值或者調用普通成員函數)。
  • 3. 常對象只能調用常函數成員。

常函數成員:能被常對象調用訪問常數據成員。

  • 1. 常函數成員聲明語法:返回值類型 func(參數表)const;
  • 2. 常函數成員定義部分時要帶上const
  • 3. 常函數調用期間,因為目標對象視為常對象,所以只能調用常函數。
  • 4. const可以用于函數重載,通過非const對象調用重載函數優先調用非const的重載函數。

常數據成員:值在初始化后不能被更新。

  • 1. 常數據成員聲明語法:const 數據類型 m;。
  • 2. 常數據成員不能被賦值,構造函數只能通過初始化列表進行初始化。
  • 3. 靜態常數據成員在類外進行定義。
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
//常成員案例
#include<iostream>
using namespace std;
 
 
class A {
public:
 void Print()const // 不修改對象數據成員值的函數應該設為常函數
  cout << a << ',' << b << ',' << s << endl;
 }
 
 A(int i) :b(i) {};  // 初始化列表初始化
 
private:
 const int a = 1; // 已初始化的常數據成員
 const int b;  // 未初始化的常數據成員
 const static int s; // 常靜態數據成員
 
};
 
 
const int A::s = 3;   // 類外定義
 
 
int main() {
 A a(2);
 a.Print();  
}

結果輸出:

1,2,3
1

常引用:常引用所引用的對象被視為常對象。

  • 1. 常引用聲明語法:const 數據類型 &引用名。
  • 2.非const的引用只能綁定到普通對象。
  • 3. 對于無需修改值的參數(復制構造函數),盡量使用const進行應用

到此這篇關于C++ 數據共享與保護的文章就介紹到這了,更多相關C++ 數據共享與保護內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!

原文鏈接:https://blog.csdn.net/AF_MAX/article/details/120638364

延伸 · 閱讀

精彩推薦
  • C/C++深入理解goto語句的替代實現方式分析

    深入理解goto語句的替代實現方式分析

    本篇文章是對goto語句的替代實現方式進行了詳細的分析介紹,需要的朋友參考下...

    C語言教程網7342020-12-03
  • C/C++詳解c語言中的 strcpy和strncpy字符串函數使用

    詳解c語言中的 strcpy和strncpy字符串函數使用

    strcpy 和strcnpy函數是字符串復制函數。接下來通過本文給大家介紹c語言中的strcpy和strncpy字符串函數使用,感興趣的朋友跟隨小編要求看看吧...

    spring-go5642021-07-02
  • C/C++C語言實現電腦關機程序

    C語言實現電腦關機程序

    這篇文章主要為大家詳細介紹了C語言實現電腦關機程序,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    xiaocaidayong8482021-08-20
  • C/C++學習C++編程的必備軟件

    學習C++編程的必備軟件

    本文給大家分享的是作者在學習使用C++進行編程的時候所用到的一些常用的軟件,這里推薦給大家...

    謝恩銘10102021-05-08
  • C/C++c++ 單線程實現同時監聽多個端口

    c++ 單線程實現同時監聽多個端口

    這篇文章主要介紹了c++ 單線程實現同時監聽多個端口的方法,幫助大家更好的理解和學習使用c++,感興趣的朋友可以了解下...

    源之緣11542021-10-27
  • C/C++C++之重載 重定義與重寫用法詳解

    C++之重載 重定義與重寫用法詳解

    這篇文章主要介紹了C++之重載 重定義與重寫用法詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下...

    青山的青6062022-01-04
  • C/C++C/C++經典實例之模擬計算器示例代碼

    C/C++經典實例之模擬計算器示例代碼

    最近在看到的一個需求,本以為比較簡單,但花了不少時間,所以下面這篇文章主要給大家介紹了關于C/C++經典實例之模擬計算器的相關資料,文中通過示...

    jia150610152021-06-07
  • C/C++C語言中炫酷的文件操作實例詳解

    C語言中炫酷的文件操作實例詳解

    內存中的數據都是暫時的,當程序結束時,它們都將丟失,為了永久性的保存大量的數據,C語言提供了對文件的操作,這篇文章主要給大家介紹了關于C語言中文件...

    針眼_6702022-01-24
主站蜘蛛池模板: 中日韩免费视频 | 91精品国产99久久久久久 | 久久免费精品视频 | 久久精品一二三区 | 77成人影院 | 国产一区二区三区高清 | av成人免费在线观看 | 久久99精品久久久久久园产越南 | 亚洲天堂ww | 亚洲第五色综合网 | 羞羞视频免费网站含羞草 | 在线看一区二区三区 | 黄色久 | 久久久久国产一区二区三区不卡 | 国产在线一区二区三区 | 久色成人 | 国产精品久久久久久婷婷天堂 | 欧美一级α片 | 在线成人免费观看www | 777午夜精品视频在线播放 | 九九热视频在线免费观看 | 一本色道久久综合亚洲精品图片 | 黄色毛片免费看 | 91午夜在线观看 | 亚洲无av | 精品国产亚洲人成在线 | 成人毛片久久 | 一级做a爱片久久 | 黄色片网站免费在线观看 | 国产亚洲精品综合一区91 | 综合97| 久久精品视频黄色 | 欧美日韩高清不卡 | 免费一级欧美大片视频 | 4480午夜 | 干一夜综合 | 天天看天天摸天天操 | 羞羞答答tv | 双性帝王调教跪撅打屁股 | 亚洲成人在线视频网 | 国产精品视频久久久 |