強(qiáng)類型語言,類型檢查嚴(yán)格
支持面向?qū)ο螅盒驮浚惓#ù蛴螒蚩刹荒墚惓#\算符重載
C++文件后綴可以是 .cpp绍绘,.cc奶镶,.c等
//includeC++本身的頭文件時 使用<不加.h>
#include <iostream>
//C 的頭文件 可以加.h 但是C++不推薦
#include <stdio.h>
//推薦 使用C++重寫的頭文件 把.h去掉 在前面加c
#include <cstdio>
//如果要 include 我們自己寫的頭文件時 使用 "" 加.h
#include "MyClass.h"
cout的是一個對象 通過<<輸出運算符 進(jìn)行輸出 可以連續(xù)輸出,endl是換行陪拘。
cin/cout代替 scanf,cout
std是命名空間厂镇,::是域運算符
std::cout << "Hello, World!\n" << 123213 << 3.4324 << 'a'<< std::endl;
std::cin >> x;
// 相當(dāng)于std::cin.operator>>(x);對象調(diào)方法,可省左刽,略寫如上
命名空間
//使用指令后的所有std命名空間下的東西 訪問時都可以不用在加 std了
using namespace std;
//變量和函數(shù)
namespace Hero {
const char *name = "英雄";
void show() {
std::cout << "英雄出現(xiàn)了" << std::endl;
}
}
//命名空間可以分開寫
namespace Hero {
int a = 200;
}
//使用聲明
using std::cout;
//C++會把所用東西都放在命名空間下捺信,如果我們自己沒有寫命名空間,默認(rèn)放在一個沒有名字的命名空間下
cout << ::name << endl;
結(jié)構(gòu)
//可以放函數(shù)
struct Date {
int year;
int month;
int day;
void show() {
cout << year << "-" << month << "-" << day << endl;
}
};
聯(lián)合就是在內(nèi)存中都占同一片地址
union MyUnion {
int x;
int y;
double d;
char cs[4];
};
//可以有匿名聯(lián)合
union {
int x;
int y;
};
枚舉:不再只是普通的int
//注意用枚舉提高代碼可讀性
enum HeroState{
Stand,
Move,
Attack,
Die
};
C++中bool是數(shù)據(jù)類型欠痴,本質(zhì)也是int迄靠,c中是宏定義
運算符可以用其他奇怪的關(guān)鍵字替換
注意值傳遞和地址傳遞
C++的參數(shù)默認(rèn)值 必須從右向左給 右邊的參數(shù)有了默認(rèn)值左邊的參數(shù)才可以給默認(rèn)值
內(nèi)聯(lián)函數(shù)
//inline 內(nèi)聯(lián)函數(shù) 執(zhí)行效率要比普通的函數(shù)高
//內(nèi)聯(lián)函數(shù)執(zhí)行的時候不會在棧中開辟空間,而是直接把內(nèi)容拷貝到得調(diào)用的方法中
//inline只是向編譯器發(fā)送請求斋否,希望成為內(nèi)聯(lián)函數(shù),編譯器會做檢查拭荤,如果內(nèi)容少茵臭,邏輯簡單就會同意申請,如果拒絕了舅世,這個函數(shù)調(diào)用還和普通函數(shù)一樣, 同常情況下旦委,如果是個遞歸函數(shù),肯定會拒絕
inline void print(int x) {
int a = 200;
int b = 300;
cout << x + a + b << endl;
}
啞元函數(shù)
//沖突時多一個參數(shù)雏亚,沒有參數(shù)名缨硝,這樣就是啞元
void print(int x, int) {
cout << x << endl;
}
int &r = x;
引用實際是別名,反正r就是x,都是同一個東西罢低,地址都一樣查辩。其實寫成
int& r=x胖笛;更好理解
r是個int類型的引用。
引用是一輩子的宜岛,不可以改地址了
// 聲明引用必須初始化
//如果要引用一個常量 必須使用常引用
const int &r3 = 500;
// r3 = 500;
弄清值傳遞x=y长踊、地址傳遞 int* p、引用傳遞&x=y
*是尋址運算符也是指針
&是取地址符也是引用
交換兩數(shù)的多種方法swap
//交換:用引用
void swap(int &x, int &y) {
cout << x << ' ' << y << endl;
int t = x;
x = y;
y = t;
cout << x << ' ' << y << endl;
}
//交換 兩數(shù)交換不使用第三個變量
void swap2(int &x, int &y) {
x = x + y;
y = x - y;
x = x - y;
}
//按位異或交換 不使用第三個變量
void swap3(int &x, int &y) {
x = x ^ y;
y = x ^ y;
x = x ^ y;
}
//永遠(yuǎn)不要返回局部變量的引用
int& fc() {
int x = 100;
return x;
}
// static_cast<類型>()
// 轉(zhuǎn)換時做靜態(tài)檢查萍倡,即在編譯時進(jìn)行
// void*到其他指針的轉(zhuǎn)換
double d = 3.1415926;
// int x = d; //隱式類型轉(zhuǎn)換
int x = static_cast<int>(d);
// reinterprect_cast<類型>()
// 允許強(qiáng)轉(zhuǎn)任何類型的指針
// 把整數(shù)強(qiáng)轉(zhuǎn)成指針身弊,指針強(qiáng)轉(zhuǎn)成整數(shù)
double *pd = reinterpret_cast<double*>(pl);
// const_cast<類型>()
// 去掉cv限制
volatile const int a = 100;//值已改但編譯器自作聰明,volatile 易揮發(fā)的
提醒編譯器還是再去內(nèi)存中取值了列敲。
int *pa = const_cast<int *>(&a); //const int *
*pa = 200;
//獲取成員變量地址用 Struct::
&Date::year;
this指針阱佛,隱式地傳入當(dāng)前對象