C++?this原理與可變參數(shù)及友元函數(shù)友元類分步詳解用法
1.c++可變參數(shù)的應(yīng)用
#include <iostream> #include <stdarg.h> //可變參數(shù)的支持 using namespace std; void add(int count,...){ va_list vp; va_start(vp, count); // 取出可變參數(shù)的一個值 int number = va_arg(vp, int); cout << number << endl; // 取出可變參數(shù)的一個值 number = va_arg(vp, int); cout << number << endl; // 取出可變參數(shù)的一個值 number = va_arg(vp, int); cout << number << endl; // 越界之后取出來的是0 number = va_arg(vp, int); cout << number << endl; // 關(guān)閉階段 va_end(vp); } int main() { add(546, 6,7,8); return 0; }
日志輸出:
/home/ms/workspace/study/ndk/CPlusStudy/cmake-build-debug/CPlusStudy
可變參數(shù)輸出
6
7
8
0
- #include <stdarg.h> 如果使用可變參數(shù),需要導(dǎo)入這個
- Java的可變參數(shù): int …
- C++的可變參數(shù)寫法:…
- va_list vp : 可變參數(shù)的動作
- va_start(vp, count):參數(shù)一:可變參數(shù)開始的動作vp,參數(shù)二:內(nèi)部需要一個 存儲地址用的參考值,如果沒有第二個參數(shù),內(nèi)部他無法處理存放參數(shù)信息
- 越界之后取出來的是0
項目中的應(yīng)用:
int add(int count,...){ va_list va; va_start(va,count); for (int i = 0; i < count; ++i) { int number=va_arg(va,int); cout << number << endl; } va_end(va); } int main() { std::cout << "可變參數(shù)輸出" << std::endl; add(3, 6,7,8); return 0; }
日志輸出:
可變參數(shù)輸出
6
7
8
第一個參數(shù)count可以作為可變參數(shù)的數(shù)量。
2.static 靜態(tài)變量與靜態(tài)方法
class Douluo { public: // static char * name="唐三"; 靜態(tài)變量不能直接初始化 編譯不通過 static char * name; Douluo() { // name="唐三"; //靜態(tài)變量不能在構(gòu)造方法初始化 } static void update() { // name="唐三"; //靜態(tài)變量不能在靜態(tài)方法初始化 cout<<"name="<<name<<endl; } void update2() { // 運行報錯 // name="唐三"; //靜態(tài)變量不能在非靜態(tài)方法初始化 } }; /*靜態(tài)變量正確初始化姿勢*/ char* Douluo::name="唐三"; int main() { // std::cout << "可變參數(shù)輸出" << std::endl; // add(3, 6,7,8); std::cout << "static的應(yīng)用" << std::endl; Douluo douluo; // Douluo::name="唐三"; //靜態(tài)變量不能在main方法初始化 會報錯 douluo.update2(); Douluo::update(); // 類名::可以調(diào)用靜態(tài)函數(shù) 調(diào)用靜態(tài)方法的正確姿勢 return 0; }
通過實際操作可知:
- 靜態(tài)變量不能在聲明的時候初始化,直接編譯不通過
- 靜態(tài)變量不能在構(gòu)造方法初始化,運行報錯
- 靜態(tài)變量不能在靜態(tài)方法初始化,運行報錯
- 靜態(tài)變量不能在非靜態(tài)方法初始化,運行報錯
- 靜態(tài)變量不能在main方法初始化運,行報錯
- 靜態(tài)變量只能在類外部,main方法外部初始化:char* Douluo::name=“唐三”;
- 靜態(tài)方法使用**類名:??*來調(diào)用
3.常量指針與指針常量
int * const 指針常量 指針常量【地址對應(yīng)的值能改,地址不可以修改】
const int * 常量指針 常量指針【地址可以修改,地址對應(yīng)的值不能改】
this : 本質(zhì)上就是指針常量
// 默認(rèn)現(xiàn)在:this 等價于 const Student * const 常量指針常量(地址不能改,地址對應(yīng)的值不能改) void changeAction() const { // 地址不能改 // this = 0x43563; // 地址對應(yīng)的值不能改 // this->age = 80; } ```### Android NDK篇-C++語言之 this 原理和可變參數(shù)與友元函數(shù)友元類 #### 1.c++可變參數(shù)的應(yīng)用 ```c++ #include <iostream> #include <stdarg.h> //可變參數(shù)的支持 using namespace std; void add(int count,...){ va_list vp; va_start(vp, count); // 取出可變參數(shù)的一個值 int number = va_arg(vp, int); cout << number << endl; // 取出可變參數(shù)的一個值 number = va_arg(vp, int); cout << number << endl; // 取出可變參數(shù)的一個值 number = va_arg(vp, int); cout << number << endl; // 越界之后取出來的是0 number = va_arg(vp, int); cout << number << endl; // 關(guān)閉階段 va_end(vp); } int main() { add(546, 6,7,8); return 0; }
日志輸出:
/home/ms/workspace/study/ndk/CPlusStudy/cmake-build-debug/CPlusStudy
可變參數(shù)輸出
6
7
8
0
- #include <stdarg.h> 如果使用可變參數(shù),需要導(dǎo)入這個
- Java的可變參數(shù): int …
- C++的可變參數(shù)寫法:…
- va_list vp : 可變參數(shù)的動作
- va_start(vp, count):參數(shù)一:可變參數(shù)開始的動作vp,參數(shù)二:內(nèi)部需要一個 存儲地址用的參考值,如果沒有第二個參數(shù),內(nèi)部他無法處理存放參數(shù)信息
- 越界之后取出來的是0
項目中的應(yīng)用:
int add(int count,...){ va_list va; va_start(va,count); for (int i = 0; i < count; ++i) { int number=va_arg(va,int); cout << number << endl; } va_end(va); } int main() { std::cout << "可變參數(shù)輸出" << std::endl; add(3, 6,7,8); return 0; }
日志輸出:
可變參數(shù)輸出
6
7
8
第一個參數(shù)count可以作為可變參數(shù)的數(shù)量。
4.static 靜態(tài)變量與靜態(tài)方法
class Douluo { public: // static char * name="唐三"; 靜態(tài)變量不能直接初始化 編譯不通過 static char * name; Douluo() { // name="唐三"; //靜態(tài)變量不能在構(gòu)造方法初始化 } static void update() { // name="唐三"; //靜態(tài)變量不能在靜態(tài)方法初始化 cout<<"name="<<name<<endl; } void update2() { // 運行報錯 // name="唐三"; //靜態(tài)變量不能在非靜態(tài)方法初始化 } }; /*靜態(tài)變量正確初始化姿勢*/ char* Douluo::name="唐三"; int main() { // std::cout << "可變參數(shù)輸出" << std::endl; // add(3, 6,7,8); std::cout << "static的應(yīng)用" << std::endl; Douluo douluo; // Douluo::name="唐三"; //靜態(tài)變量不能在main方法初始化 會報錯 douluo.update2(); Douluo::update(); // 類名::可以調(diào)用靜態(tài)函數(shù) 調(diào)用靜態(tài)方法的正確姿勢 return 0; }
通過實際操作可知:
- 靜態(tài)變量不能在聲明的時候初始化,直接編譯不通過
- 靜態(tài)變量不能在構(gòu)造方法初始化,運行報錯
- 靜態(tài)變量不能在靜態(tài)方法初始化,運行報錯
- 靜態(tài)變量不能在非靜態(tài)方法初始化,運行報錯
- 靜態(tài)變量不能在main方法初始化運,行報錯
- 靜態(tài)變量只能在類外部,main方法外部初始化:char* Douluo::name=“唐三”;
- 靜態(tài)方法使用**類名:??*來調(diào)用
5.常量指針與指針常量
int * const 指針常量 指針常量【地址對應(yīng)的值能改,地址不可以修改】
const int * 常量指針 常量指針【地址可以修改,地址對應(yīng)的值不能改】
this : 本質(zhì)上就是指針常量
// 默認(rèn)現(xiàn)在:this 等價于 const Student * const 常量指針常量(地址不能改,地址對應(yīng)的值不能改) void changeAction() const { // 地址不能改 // this = 0x43563; // 地址對應(yīng)的值不能改 // this->age = 80; }
方法名后邊添加const 符號,表示的意思是常量指針常量,這個情況下值不能改,地址也不能改。
6.friend 友元函數(shù)
class Person { private: // 私有的age,外界不能訪問 int age = 0; public: Person(int age) { this->age = age; } int getAge() { return this->age; } // 定義友元函數(shù) (聲明,沒有實現(xiàn)) friend void updateAge(Person * person, int age); }; // 友元函數(shù)的實現(xiàn),可以訪問所以私有成員 void updateAge(Person* person, int age) { // 默認(rèn)情況下:不能修改 私有的age // 誰有這個權(quán)限:友元(拿到所有私有成員) person->age = age; } int main(){ Person person = Person(30); updateAge(&person, 31); cout << person.getAge() << endl; }
日志輸出:
/home/ms/workspace/study/ndk/CPlusStudy/cmake-build-debug/CPlusStudy
31
友元函數(shù)是為了私有成員在沒有set方法的情況下,可以通過友元函數(shù)來訪問私有成員變量。
7.友元類
class ImageView { private: int viewSize; friend class Class; // 友元類 }; // Java每個類,都會有一個Class,此Class可以操作 ImageView私有成員(感覺很神奇) class Class { public: ImageView imageView; void changeViewSize(int size) { imageView.viewSize = size; } int getViewSize() { return imageView.viewSize; } }; int main(){ Class mImageViewClass; mImageViewClass.changeViewSize(600); cout << mImageViewClass.getViewSize() << endl; }
Java每個類,都會有一個Class,此Class可以操作 ImageView私有成員,友元類就類比Java的中的Class,如果去掉friend,就不能訪問ImageView的成員了。
方法名后邊添加const 符號,表示的意思是常量指針常量,這個情況下值不能改,地址也不能改。
8.friend 友元函數(shù)
class Person { private: // 私有的age,外界不能訪問 int age = 0; public: Person(int age) { this->age = age; } int getAge() { return this->age; } // 定義友元函數(shù) (聲明,沒有實現(xiàn)) friend void updateAge(Person * person, int age); }; // 友元函數(shù)的實現(xiàn),可以訪問所以私有成員 void updateAge(Person* person, int age) { // 默認(rèn)情況下:不能修改 私有的age // 誰有這個權(quán)限:友元(拿到所有私有成員) person->age = age; } int main(){ Person person = Person(30); updateAge(&person, 31); cout << person.getAge() << endl; }
日志輸出:
/home/ms/workspace/study/ndk/CPlusStudy/cmake-build-debug/CPlusStudy
31
友元函數(shù)是為了私有成員在沒有set方法的情況下,可以通過友元函數(shù)來訪問私有成員變量。
9.友元類
class ImageView { private: int viewSize; friend class Class; // 友元類 }; // Java每個類,都會有一個Class,此Class可以操作 ImageView私有成員(感覺很神奇) class Class { public: ImageView imageView; void changeViewSize(int size) { imageView.viewSize = size; } int getViewSize() { return imageView.viewSize; } }; int main(){ Class mImageViewClass; mImageViewClass.changeViewSize(600); cout << mImageViewClass.getViewSize() << endl; }
Java每個類,都會有一個Class,此Class可以操作 ImageView私有成員,友元類就類比Java的中的Class,如果去掉friend,就不能訪問ImageView的成員了。
到此這篇關(guān)于C++ this原理與可變參數(shù)及友元函數(shù)友元類分布詳解用法的文章就介紹到這了,更多相關(guān)C++ this原理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語言詳細(xì)圖解浮點型數(shù)據(jù)的存儲實現(xiàn)
使用編程語言進(jìn)行編程時,需要用到各種變量來存儲各種信息。變量保留的是它所存儲的值的內(nèi)存位置。這意味著,當(dāng)您創(chuàng)建一個變量時,就會在內(nèi)存中保留一些空間。您可能需要存儲各種數(shù)據(jù)類型的信息,操作系統(tǒng)會根據(jù)變量的數(shù)據(jù)類型,來分配內(nèi)存和決定在保留內(nèi)存中存儲什么2022-05-05基于Windows C++ 應(yīng)用程序通用日志組件的使用詳解
眾所周知,在調(diào)試、跟蹤和執(zhí)行應(yīng)用程序的過程中,程序的日志能為這些工作提供大量有價值的運行信息。因此,程序的日志對應(yīng)用程序的運行、維護(hù)至關(guān)重要2013-05-05va_list(),va_start(),va_arg(),va_end() 詳細(xì)解析
這些宏定義在stdarg.h中,所以用到可變參數(shù)的程序應(yīng)該包含這個頭文件.下面我們寫一個簡單的可變參數(shù)的函數(shù),該函數(shù)至少有一個整數(shù)參數(shù),第二個參數(shù)也是整數(shù),是可選的.函數(shù)只是打印這兩個參數(shù)的值2013-09-09C++11新特性之右值引用與完美轉(zhuǎn)發(fā)詳解
C++11標(biāo)準(zhǔn)為C++引入右值引用語法的同時,還解決了一個短板,即使用簡單的方式即可在函數(shù)模板中實現(xiàn)參數(shù)的完美轉(zhuǎn)發(fā)。本文就來講講二者的應(yīng)用,需要的可以參考一下2022-09-09