1. 程式人生 > >C++基本語法總結

C++基本語法總結

C++輸入輸出:

#include <stdlib.h>
#include <iostream>
#include <string>
using namespace std;

/**
 * C++輸入輸出demo
 */
int main() {
	int x, y;

	cout << "C++";
	cout << "666666" << endl;
	cout << "006030 -> " << 3 + 0 + 6 << endl;
	cin >> x >> y;
	cin >> x >> y;
	cin >> y;
	cout << "x + y -> " << x + y << endl;

	return 0;
}

C++新特性:

#include <iostream>
using namespace std;

int main() {
//	1、新的資料型別
	bool flag = true;
	if(flag){
		cout << flag << endl;
		cout << boolalpha << flag << endl;
	}
//	2、直接初始化
	int i(32);
	cout << i << endl;
	const j(10);
	cout << j << endl;
//	3、隨用隨定義跟Java類似
	return 0;
}

C++資料型別的引用:

#include <iostream>
using namespace std;

typedef struct {
	int x;
	int y;
} Coor;

// 用指標交換兩個數
void fun(int *a, int *b) {
	int c = 0;
	c = *a;
	*a = *b;
	*b = c;
}

// 用C++引用交換兩個數
void fun(int &a, int &b) {
	int c = 0;
	c = a;
	a = b;
	b = c;
}

// 普通常量不能實現交換
void fun1(int a, int b) {
	int c = 0;
	c = a;
	a = b;
	b = c;
}

/**
 * 不管是變數的引用還是結構體或者其它都必須要先初始化
 */
int main() {
	// 1、變數的引用
	int a = 3;
	//b就相當於是a的別名,即是另外一個引用方式,操作b即是操作了a,操作a即是操作了b
	int &b = a; //必須要初始化引用
	cout << "b = " << b << endl;
	b = 10;
	cout << "a = " << a << endl;
//2、結構體的引用
	Coor c1;
	Coor &c = c1; //必須要初始化引用
	c.x = 10;
	c.y = 20;
	cout << "c1.x = " << c1.x << endl;
	cout << "c1.y = " << c1.y << endl;
//	3、指標型別的引用
//	型別  *&指標引用名  = 指標變數
	int x = 10;
	int *p = &x; //必須要初始化引用
	int *&q = p; // 這邊賦值的仍然是一個地址,即是q是一個地址
	*q = 20;
	cout << "q = " << q << endl;
	cout << "x = " << x << endl;

	*p = 30;
	cout << "p = " << p << endl; // p代表的是地址
	cout << "*p = " << *p << endl; // *p代表的是指向這個記憶體地址的值

	int v = 15, f = 10;
	fun(&v, &f);
	cout << "v = " << v << endl;
	cout << "f = " << f << endl;

	fun(v, f);
	cout << "v = " << v << endl;
	cout << "f = " << f << endl;

	fun1(v, f);
	cout << "v = " << v << endl;
	cout << "f = " << f << endl;
	return 0;
}

C++名稱空間:

#include <stdlib.h>
#include <iostream>
#include <string>
using namespace std;

namespace myNameSpace {
int A;

class Liu{
public:
	void setA(){
		A = 20;
	}
};

void print(){
	cout << "A :" << A << endl;
}

int getMax(int num) {
	return num;
}
}

using namespace myNameSpace;

int main() {
	myNameSpace::A = 10;
	myNameSpace::print();
	myNameSpace::Liu liu;
	liu.setA();
	print();
	std::cout << "名稱空間的使用:" << myNameSpace::getMax(9) << std::endl;

	return 0;
}

C++記憶體管理:

#include <iostream>
using namespace std;

/**
 * 	           什麼是記憶體管理?
 * 記憶體本質是什麼?       	資源
 * 誰掌管記憶體資源?		作業系統
 * 我們能做什麼?		申請/歸還
 * 	   申請/歸還記憶體資源就是記憶體管理
 */

/**	一、	物件是如何儲存在記憶體中的?
 * 			記憶體分割槽
 * 1、棧區 	int i = 1;定義一個變數
 * 2、堆區	int *p = new int[10];
 * 3、全域性區	儲存的全域性變數和靜態變數
 * 4、常量區	string str = "c++"
 * 5、程式碼區	儲存邏輯程式碼的二進位制
 */

int main() {
	/**
	 * 	C語言記憶體申請和釋放
	 * 	void *malloc(size_t size)
	 * 	void free(void *memblock)
	 */

	/**
	 * C++中記憶體申請和釋放使用關鍵字new和delete,需要配套使用
	 */
	//申請
	int *p = new int(10);
	if (NULL == p) {
		system("pause");
		return 0;
	}
	//釋放
	delete p;
	p = NULL;

	//如何申請和釋放記憶體塊?
	int *arr = new int[1000];
	//假設記憶體申請失敗
	if (NULL == arr) {
		system("pause");
		return 0;
	}
	delete[] arr;//如果不加[],則只會釋放arr[0]的記憶體
	arr = NULL;

	cout << "C++記憶體管理" << endl;
	return 0;
}

C++堆疊記憶體使用方式:

#include <stdlib.h>
#include <iostream>
using namespace std;

class Tv {
public:
	int x = 10;
	int y = 20;
	void px() {
		cout << x << endl;
	}
	void py() {
		cout << y << endl;
	}
};

int main() {
	Tv tv;

	cout << tv.x << endl; //在記憶體開闢一塊棧空間,不需要主動釋放
	tv.px();
	tv.py();

//	Tv *tvNew;
	Tv *tvNew = new Tv(); // 向記憶體申請一塊堆空間
	if (NULL == tvNew) {
		system("pause");
		return 0;
	}
	// 類似於C語言的寫法
	cout << (*tvNew).x << endl;
	(*tvNew).px();
	(*tvNew).py();
	// 類似於NDK程式設計的寫法
	cout << tvNew->x << endl;
	tvNew->px();
	tvNew->py();

	delete tvNew; // 在記憶體中申請的堆空間,需要主動釋放
	tvNew = NULL;
	return 0;
}

C++類物件的定義與使用:

#include <iostream>
using namespace std;

class Tv {
public:
	int x = 10;
	int y = 20;
	void px() {
		cout << x << endl;
	}
	void py() {
		cout << y << endl;
	}
};

int main() {
	Tv tv;//在記憶體開闢一塊棧空間,不需要主動釋放
	Tv tvs[10]; //申請一塊連續的記憶體空間
	cout << tv.x << endl;
	tv.px();
	tv.py();

	//	Tv *tvNew;
	Tv *tvNew = new Tv(); // 向記憶體申請一塊堆空間
	if (NULL == tvNew) {
		system("pause");
		return 0;
	}

	// 類似於C語言的寫法
	cout << (*tvNew).x << endl;
	(*tvNew).px();
	(*tvNew).py();
	// 類似於NDK程式設計的寫法
	cout << tvNew->x << endl;
	tvNew->px();
	tvNew->py();

	delete tvNew; // 在記憶體中申請的堆空間,需要主動釋放
	tvNew = NULL;

	Tv *tvss = new Tv[10];
	if(NULL == tvss){
		return 0;
	}
	delete []tvss;//刪除棧區所有的Tv物件
	tvss = NULL;
	return 0;
}

C++函式新特性:

#include <iostream>
using namespace std;

//函式預設值規則:有預設引數值的引數 ,必須要在引數列表的最右端
//給函式引數預設值時推薦宣告函式時給出,不推薦定義函式時再給,因為函式宣告時給出則可通過所有編譯器,而函式定義時給出可能過不了某些編譯器
/**
 * 函式宣告
 */
void fun(int i, int k = 5, int j = 10);
//void fun(int i,int k = 5, int j);// 編譯出錯

/**
 * 函式定義
 */
void fun(int i, int k, int j) {
	cout << i << k << j << endl;
}

/**
 * 宣告行內函數 inline關鍵字:行內函數編譯器處理時相當於只調用方法體裡面的邏輯,好處省時,適用於迴圈呼叫該函式時用
 *
 * 為什麼不把所有函式都寫成行內函數?
 * 1、內聯編譯時建議性的,由編譯器決定
 * 2、邏輯簡單,呼叫頻繁的函式建議使用內聯
 * 3、遞迴函式無法使用內聯方式,編譯器會把遞迴函式當成普通函式處理
 */
inline int getMax(int i, int j, int k);
int getMax(int i, int j, int k) {
	int max = 0;
	if(i>j){
		max = i;
	}else{
		if(j>k){
			max = j;
		}else{
			max = k;
		}
	}
	return max;
}

/**
 * 1、函式引數預設值
 * 2、函式過載
 * 3、行內函數
 */
int main() {
	// 無實參值則用預設引數值,否則實參值覆蓋函式預設值
	fun(20);
	fun(20, 30);
	fun(20, 30, 40);
	// 行內函數使用:
	int i = 1, j = 2, k = 3, max;
	max = getMax(i, j, k);
	cout << "max = " << max << endl;
	return 0;
}

/*************函式過載***********************/
// 在相同作用域內,函式名稱相同,引數個數,引數型別或者返回值不同的稱之為函式過載
int getMax(int i, int j) {
	// to do
	return 0;
}

float getMax(float i, float j) {
	// to do
	return 0;
}

double getMax(double i, double j) {
	// to do
	return 0;
}

C++string型別的使用:

#include <iostream>
#include <string>//引入標頭檔案
using namespace std;

int main() {
	string name = "liugx";
	string age("27");//直接初始化
	string s1(name);
	string s2(5,'c');
	cout << name << age << endl;
	cout << s1 << s2 << endl;

	if(!name.empty())
		cout << s1 << s2 << endl;
	s1 = name + age;
	name = age;

	/**
	 * 0、與java不同,string型別是小寫s開頭
	 * 1、與java不同,要取字串中的某個字元直接陣列下標方式獲取
	 * 2、與java不同,判斷兩個字串相等不用equeals()方法
	 * 3、與java不同,兩個固定字串不能相加,中間需要加上一個變數字串才能相加-------------特別注意
	 * string s3 = "hello"+"hailo" 錯誤方式
	 * string s3 = "hello"+ name +"hailo" 正確方式
	 */
	cout << name[0] << endl;

	if(s1 == s2){

	}else if(s1 != s2){

	}

	return 0;
}

C++關鍵字const的使用:

#include <iostream>
using namespace std;

#define X 3 //巨集定義常量跟const常量的區別   巨集定義編譯器不會檢查語法錯誤,而const則會檢查語法問題

/**
 * const與java中的final類似,被修飾的基本變數是不能改變其內容的
 */
int main() {
	// 1、const修飾基本變數
	const int x = 3; // x的值不能再被改變

	// 2、const修飾指標變數
	// 這兩種完全等價
	const int *p = NULL;
	int const *p = NULL;
	// 此時修飾的是*p *p不能賦值,但是p可以賦值

	int * const p = NULL;
	// 此時修飾的是p p不能賦值,但是*p可以賦值

	// 這兩種完全等價
	const int * const p = NULL;
	int const * const p = NULL;
	// 此時修飾的是*p和p,*p和p都不能賦值

	// 3、const修飾別名引用
	int x = 3;
	const int &y = x;
//	此時修飾的是引用y,y不能再賦值,x可以賦值

	const int x = 3;
	int *y = &x;
	// 用可變的*y去操作不可變的x,許可權大-許可權小 編譯器出錯
	int x = 3;
	const int *y = &x;
	// *y不可變,x可變,許可權小-許可權大  正確寫法

//	cout << "C++" << endl;
	return 0;
}

void fun(const int &a,const int &b){
	// 被const修飾過的形參a和b不能改變其值
}


//常物件
//
//如果在宣告物件的時候用const修飾,則稱被宣告的物件為常物件。常物件的資料成員值在物件的整個生命週期內不能被改變。
//
//定義:類名 const 物件名[(引數表)]或者const 類名 物件名[(引數表)]
//
//在定義物件時必須進行初始化,而且不能被更新,C++不允許直接或間接的更改常物件的資料成員。
//
//常物件成員
//
//(1) 常資料成員
//
//類的資料成員可以是常量或常引用,使用const說明的資料成員稱為常資料成員。如果在一個類中聲明瞭常資料成員,那麼建構函式就只能通過初始化列表對該資料成員進行初始化,而任何其他的函式都不能對該成員函式賦值。
//
//(2) 常成員函式
//
//在類中使用關鍵字const的函式稱為常成員函式,常成員函式的格式如下:
//
//返回型別 函式名(引數表)const;
//
//const是函式型別的組成部分,所以在函式的實現部分也要帶關鍵字const。
//如:
void showDate() const;       // 宣告
void showDate() const       // 實現
{
    printf(“year”);
}
//說明:
//
//  a. 如果將一個物件宣告為常物件,則通過該物件只能呼叫它的常成員函式,而不能呼叫普通的成員函式。常成員函式是常物件的唯一的對外介面。
//
//  b. 常成員函式不能更新物件的資料成員,也不能呼叫該類中的普通成員函式,這就保證了在常成員函式中絕對不會更新資料成員的值。

C++關鍵字const常指標和常引用:

#include <iostream>
using namespace std;

class Coordinate {
public:
	Coordinate(int x, int y);
	void print();
	void println() const;
	void setX(int x);
	void changeX() const; //常成員函式
	void changeX();
	// 以上兩個changeX()函式互為過載

//	const Coordinate coor;
//	coor.changeX();//此時呼叫的為常成員函式

//	Coordinate coor;
//	coor.changeX();//此時呼叫的為普通成員函式

	//說明:
	//
	//  a. 如果將一個物件宣告為常物件,則通過該物件只能呼叫它的常成員函式,而不能呼叫普通的成員函式。常成員函式是常物件的唯一的對外介面。
	//
	//  b. 常成員函式不能更新物件的資料成員,也不能呼叫該類中的普通成員函式,這就保證了在常成員函式中絕對不會更新資料成員的值。

private:
	int mX;
	int mY;
};

#include "Coordinate.h"

Coordinate::Coordinate(int x,int y):mX(x),mY(y){
	cout << "Coordinate()" << endl;
}

void Coordinate::print(){
	cout << "mx = " << mX << endl;
	cout << "my = " << mY << endl;
}

void Coordinate::setX(int x){
	mX = x;
}

void Coordinate::changeX() const{// 常成員函式不能修改資料成員的值
//	mX = 20;
}

void Coordinate::changeX() {
	mX = 20;
}

void Coordinate::println() const{
	cout << "呼叫常成員函式" << endl;
	cout << "mx = " << mX << endl;
	cout << "my = " << mY << endl;
}

#include "Coordinate.h"
#include <iostream>
using namespace std;

int main() {
	Coordinate coor(1, 2);
	coor.println();

//	Coordinate &coor2(coor);
//	coor2.println();
//
//	Coordinate *pcoor = &coor;
//	pcoor->println();

	const Coordinate &coor2(coor);
	coor2.println();
//	coor2.setX(0);//出錯
	// 常物件成員,常指標,常引用只能呼叫常成員函式,不能呼叫普通函式
	const Coordinate *pcoor = &coor;
	pcoor->println();
	pcoor->setX(0);// 出錯:注意const修飾的位置,此時pcoor為常物件,只能呼叫常成員函式

	Coordinate * const pcoor1 = &coor;// 注意const修飾的位置,此時pcoor1為常指標,pcoor1指標只能指向coor
	pcoor1->setX(0);// 不出錯
	pcoor1->println();
	pcoor1 = &coor2;// 編譯出錯
	return 0;
}

C++關鍵字const常物件成員和常成員函式:

#include <iostream>
#include "Coordinate.h"
using namespace std;

class Line {
public:
//	Line();
	Line(int x1, int y1, int x2, int y2);
	~Line();
//	void setA(int x,int y);
//	void setB(int x,int y);
	Coordinate getCoorA();
	Coordinate getCoorB();
	void changeA() const; //常成員函式
	void changeB();
private:
	const Coordinate m_A; //常成員物件
	const Coordinate m_B;
};

#include "Line.h"

//Line::Line(){
//	cout << "Line()" << endl;
//}

Line::Line(int x1, int y1, int x2, int y2) :
		m_A(x1, y1), m_B(x2, y2) {
	cout << "Line()" << endl;
}
Line::~Line() {
	cout << "~Line()" << endl;
}

Coordinate Line::getCoorA() {
	return m_A;
}
Coordinate Line::getCoorB() {
	return m_B;
}

void Line::changeA() const { // 常成員函式不能修改資料成員的值
//	m_A...
}
void Line::changeB() {

}

#include <iostream>
using namespace std;

class Coordinate {
public:
	Coordinate(int x, int y);
	void print();
	void setX(int x);
	void changeX() const; //常成員函式
	void changeX();
	// 以上兩個changeX()函式互為過載

//	const Coordinate coor;
//	coor.changeX();//此時呼叫的為常成員函式

	//	Coordinate coor;
	//	coor.changeX();//此時呼叫的為普通成員函式

	//說明:
	//
	//  a. 如果將一個物件宣告為常物件,則通過該物件只能呼叫它的常成員函式,而不能呼叫普通的成員函式。常成員函式是常物件的唯一的對外介面。
	//
	//  b. 常成員函式不能更新物件的資料成員,也不能呼叫該類中的普通成員函式,這就保證了在常成員函式中絕對不會更新資料成員的值。
	void println() const;
private:
	int mX;
	int mY;
};

#include "Coordinate.h"

Coordinate::Coordinate(int x,int y):mX(x),mY(y){
	cout << "Coordinate()" << endl;
}

void Coordinate::print(){
	cout << "mx = " << mX << endl;
	cout << "my = " << mY << endl;
}

void Coordinate::setX(int x){
	mX = x;
}

void Coordinate::changeX() const{// 常成員函式不能修改資料成員的值
//	mX = 20;
}

void Coordinate::changeX() {
	mX = 20;
}

void Coordinate::println() const{
	cout << "呼叫常成員函式" << endl;
	cout << "mx = " << mX << endl;
	cout << "my = " << mY << endl;
}

#include <iostream>
using namespace std;
#include "Line.h"

/**
 * 1、常成員物件的值不能被修改
 *
 * 2、常成員函式不能修改資料成員的值
 */
int main() {
	Line line(1, 3, 5, 8);
	line.getCoorA().println();
	line.getCoorB().print();
	return 0;
}