叁-拾玖|c++入门笔记
c++初識(shí)
cout在std命名空間下
換行endl;
system("pause");//阻塞 return EXIT_SUCCESS;返回正常退出 #define _CRT_SECURE_NO_WARNINGS //當(dāng)使用老的不安全函數(shù)仍然能編譯通過面向?qū)ο笕筇匦?#xff1a;封裝、繼承、多態(tài)
雙冒號(hào)作用域運(yùn)算符
::代表作用域 如果前面什么都不添加 代表全局作用域
cout<<"atk="<<atk<<std::endl; //atk為局部變量,endl為std作用域下的變量 cout<<"全局atk="<<::atk<<std::endl; //atk為全局變量。namespace命名空間
為了避免二義性,解決名稱沖突,會(huì)在頭文件里將同名函數(shù)定義到命名空間下即可。
//game1.h內(nèi)部分代碼 ··· namespace KingGlory {void goAtk(); } ··· //game2.h內(nèi)部分代碼 ··· namespace LOL {void goAtk(); } ··· //game1.cpp內(nèi)部分代碼 #include"game1.h" #include"game2.h" ··· void KingGlory::goAtk() {cout << "王者榮耀攻擊實(shí)現(xiàn)" << endl; } void LOL::goAtk() {cout << "LOL攻擊實(shí)現(xiàn)" << endl;}命名空間下可以存放 : 變量、函數(shù)、結(jié)構(gòu)體、類…
命名空間必須要聲明在全局作用域
不可以在函數(shù)體內(nèi)使用命名空間
命名空間可以嵌套命名空間
··· namespace B {int m_A = 10;namespace C{int m_A = 20;} } void test03() {cout << "B空間下的m_A = " << B::m_A << endl;cout << "C空間下的m_A = " << B::C::m_A << endl; } ···命名空間是開放的,可以隨時(shí)將新成員添加到命名空間下
再聲明命名空間,作用是合并而不是覆蓋。
命名空間可以匿名的
匿名命名空間是全局的,相當(dāng)于是聲明了靜態(tài)變量。
命名空間可以起別名
namespace veryLongName {int m_E = 10000; } void test06() {namespace veryShortName = veryLongName;cout << veryShortName::m_E << endl;cout << veryLongName::m_E << endl;//兩個(gè)名都可以找到命名空間的變量 }using聲明
void test01() {int sunwukongId = 2;//1、using聲明//using KingGlory::sunwukongId ; //當(dāng)using聲明與 就近原則同時(shí)出現(xiàn),出錯(cuò),盡量避免//就近原則:先選擇調(diào)用函數(shù)體內(nèi)的,再選擇調(diào)用函數(shù)體外的cout << sunwukongId << endl;}using編譯指令
void test02() {//int sunwukongId = 2;//2、using編譯指令using namespace KingGlory;using namespace LOL;//當(dāng)using編譯指令 與 就近原則同時(shí)出現(xiàn),優(yōu)先使用就近//當(dāng)using編譯指令有多個(gè),需要加作用域 區(qū)分cout << KingGlory::sunwukongId << endl;cout << LOL::sunwukongId << endl; }C++對(duì)C語言的增強(qiáng)和拓展
1、全局變量監(jiān)測(cè)增強(qiáng)
int a; int a = 10;//c++中會(huì)報(bào)錯(cuò)重復(fù)定義C++檢測(cè)出重定義,而C監(jiān)測(cè)不出來。
2、函數(shù)監(jiān)測(cè)增強(qiáng)
getRectS( w , h)//c中不會(huì)報(bào)錯(cuò) {return w *h; } void test01() {printf("%d\n", getRectS(10, 10, 10)); } int getRectS(int w,int h)//c++中必須加上形參類型。 {return w *h; } void test01() {printf("%d\n", getRectS(10, 10)); }c中返回值不能檢測(cè),形參類型不能檢測(cè),函數(shù)調(diào)用個(gè)數(shù)不能檢測(cè),而c++中這些都可以實(shí)現(xiàn)。
3、類型轉(zhuǎn)換監(jiān)測(cè)增強(qiáng)
void test02() {char * p = malloc(64);//c中不會(huì)報(bào)錯(cuò) } void test02() {char * p = (char *)malloc(64);//cpp中需要強(qiáng)制類型轉(zhuǎn)換 }4、struct增強(qiáng)
c++可以放函數(shù),創(chuàng)建結(jié)構(gòu)體變量,可以簡(jiǎn)化關(guān)鍵字 struct,而c不可以
struct Person {int age;void func()//C中會(huì)報(bào)錯(cuò){age++;} };5、bool類型拓展
C語言下,沒有bool類型,而c++下有。
bool flag = true; //bool類型 代表 真和假 true ----真(1) false ----假(0)void test04() {cout << sizeof(bool) << endl; //結(jié)果是1個(gè)字節(jié)//flag = false;//flag = 100; //將非0的數(shù)都為1,false為0;cout << flag << endl; }6、三目運(yùn)算符增強(qiáng)
void test05() {//?:int a = 10;int b = 20;printf("ret = %d\n", a > b ? a : b);(a < b ? a : b )= 100; // C++下返回的是變量 b = 100printf("a = %d\n", a);printf("b = %d\n", b); }7、const增強(qiáng)
全局const
c++與c結(jié)論一致
const int m_A = 100;局部const
void test06() {//m_A = 200;//int * p = (int *)&m_A;//*p = 200;//局部constconst int m_B = 100;//m_B = 200;int * p = (int *)&m_B;//修改失敗*p = 200;cout << "m_B = " << m_B << endl;int arr[m_B]; //C++下const修飾的變量稱為常量}外部鏈接屬性
C語言下的const修飾全局變量默認(rèn)是外部鏈接屬性
//test.c const int g_a = 1000; //main.c #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<string.h> #include<stdlib.h> //外部鏈接屬性: int main(){extern const int g_a;//告訴編譯器在外部有一個(gè)g_a //報(bào)錯(cuò):一個(gè)無法解析的外部命令:鏈接出的錯(cuò)printf("g_a = %d\n", g_a);system("pause");return EXIT_SUCCESS; }而C++下的const修飾的全局變量默認(rèn)是內(nèi)部鏈接屬性
//test.cpp extern const int g_b = 1000;//可以加關(guān)鍵字extern提高作用域 //const int g_b=1000;//默認(rèn)是內(nèi)部鏈接屬性 //main.cpp #define _CRT_SECURE_NO_WARNINGS #include<iostream> using namespace std;int main(){extern const int g_b;cout << "g_b = " << g_b << endl;;system("pause");return EXIT_SUCCESS; }const分配內(nèi)存情況
1、 對(duì)const變量取地址,會(huì)分配臨時(shí)內(nèi)存
void test01() {const int a = 10;//改不掉,因?yàn)闆]有分配內(nèi)存int * p = (int *)&a; }2、使用普通變量初始化const變量的時(shí)候
void test02() {int a = 10;const int b = a;//b分配到棧上//如果把a(bǔ)換成10就修改不成功,因?yàn)檫@時(shí)候把b放在符號(hào)表中,沒有分配內(nèi)存,沒有地址//然后分配了一個(gè)臨時(shí)變量temp給b,讓指針p指向bint *p = (int *)&b;//定義一個(gè)一級(jí)指針儲(chǔ)存b的地址*p = 1000;//指針p指向的變量修改為1000//分配內(nèi)存了,所以修改成功 cout << "b = " << b << endl;}3、對(duì)于自定義的數(shù)據(jù)類型
struct Person {string m_Name;//需要包含頭文件int m_Age; }; void test03() {const Person p={"xiaoming",20};//const變量必須初始化//p.m_Age = 10;//直接修改是失敗的Person * pp = (Person *)&p;(*pp).m_Name = "Tom";//pp是一個(gè)指針pp->m_Age = 10;cout << "姓名: " << p.m_Name << " 年齡: " << p.m_Age << endl; }盡量用const替換define
//define MAX 1024 //undifine 卸載宏 //const int max =1024;//const是有類型的而define沒有類型,const有作用域,define沒有作用域引用的基本語法
引用的目的:起別名
引用的基本語法:
類型 &別名 = 原名;
引用必須初始化,并且引用一旦初始化后就不可以引向其他向量。
對(duì)數(shù)組建立引用
1、直接建立引用
int arr[10];int(&pArr)[10] = arr;for (int i = 0; i < 10; i++){arr[i] = 100 + i;}for (int i = 0; i < 10; i++){cout << pArr[i] << endl;}//用原名方式賦值,別名方式打印2、先定義數(shù)組類型,再通過類型定義引用
typedef int(ARRAY_TYPE)[10];//創(chuàng)建一個(gè)10個(gè)元素?cái)?shù)組類型//類型 &別名 = 原名ARRAY_TYPE & pArr2 = arr;//類型 ARRAY_TYPE 別名 pArr2 //別名可以起多個(gè)for (int i = 0; i < 10; i++){cout << pArr2[i] << endl;}參數(shù)的傳遞方式
1、值傳遞
void mySwap01(int a , int b) {int temp = a;a = b;b = temp;/*cout << ":::a = " << a << endl;cout << ":::b = " << b << endl;*/ } //只能修改函數(shù)里的ab,不能修改函數(shù)外的ab2、地址傳遞
void mySwap02(int *a, int *b) {int temp = *a;*a = *b;*b = temp; }3、引用傳遞
void mySwap03(int &a , int &b) // int &a = a; int &b = b; {int temp = a;a = b;b = temp; }引用注意事項(xiàng)
1、引用必須引一塊合法內(nèi)存空間
void test02() {//int &a = 10;2、不要返回局部變量的引用
int &ref = func();cout << "ref = " << ref << endl;cout << "ref = " << ref << endl;//指向了一個(gè)局部變量//第一次可以保留,第二次就釋放掉了 }3、函數(shù)返回值是引用的時(shí)候,可以當(dāng)做左值去計(jì)算
int& func2() {static int a = 10;//沒有被釋放掉return a; }void test03() {int &ref = func2();cout << "ref = " << ref << endl;cout << "ref = " << ref << endl;cout << "ref = " << ref << endl;cout << "ref = " << ref << endl;//當(dāng)函數(shù)的返回值是引用,可以作為左值去計(jì)算func2() = 1000;cout << "ref = " << ref << endl;}指針引用
p指向指針的指針 *p 指向的是person本體 **p person本體
struct Person {int age; };void allocateSpace(Person ** p) { *p = (Person *)malloc(sizeof(Person));//malloc返回的是void *,然后強(qiáng)制轉(zhuǎn)換為一個(gè)Person*(*p)->age = 10;}void test01() {Person * p = NULL;//定義一個(gè)空指針allocateSpace(&p);//通過一段代碼給它分配內(nèi)存cout << "p.age = " << p->age << endl; } //利用引用可以簡(jiǎn)化指針 //可以直接用同級(jí)指針的引用給同級(jí)指針分配空間malloc動(dòng)態(tài)內(nèi)存空間分配函數(shù),如果分配成功:則返回指向被分配內(nèi)存空間的指針。不然,返回空指針NULL。malloc只管分配內(nèi)存,并不能對(duì)其進(jìn)行初始化。所以得到的一片新內(nèi)存中,其值將是隨機(jī)的。一般意義上:我們習(xí)慣性的將其初始化為NULL。當(dāng)然,也可以用memset函數(shù)的。void *類型可以強(qiáng)轉(zhuǎn)為任何其他類型的的指針。malloc則必須由我們計(jì)算字節(jié)數(shù),并且在返回的時(shí)候強(qiáng)轉(zhuǎn)成實(shí)際指定類型的指針。
引用的自動(dòng)轉(zhuǎn)換
#include<iostream> using namespace std; //發(fā)現(xiàn)是引用,轉(zhuǎn)換為 int*const ref = &a void testFunc(int& ref){ref=100; }int main() {int a = 10;int& aRef = a;//自動(dòng)轉(zhuǎn)換為int* const aRef = &a;//這也能說明引用為什么必須初始化aRef = 20;//內(nèi)部發(fā)現(xiàn)aRed是引用,自動(dòng)幫我們轉(zhuǎn)換為*aRef = 20;cout<<"a:"<<endl;cout<<"aRef:"<<aRef<<endl;testFunc(a);return EXIT_SUCCESS; } void test01() {//int &ref = 10;//引用必須要有一個(gè)合法空間const int &ref = 10; // 加了const之后,相當(dāng)于寫成//int temp = 10;//const int &ref = temp;int *p = (int *)&ref;// int* = const int**p = 10000;cout << ref << endl;//指針修改臨時(shí)內(nèi)存 }void showValue(const int &a)//防止修改掉a {//a = 100000;//把外面的a修改掉了,因?yàn)橐弥赶虻氖峭饷娴腶cout << "a = " << a << endl;}常量引用的使用場(chǎng)景 修飾函數(shù)中的形參,防止誤操作
void test02() {int a = 100;showValue(a);}總結(jié)
以上是生活随笔為你收集整理的叁-拾玖|c++入门笔记的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 北方工商管理研修学院计算机,北方工商管理
- 下一篇: C++语法(二十)常函数、常对象