1.手动编译:
单文件:
$ g++ test.cpp -o myname
$ ./ myname
多文件:
$ g++ test1.cpp test2.cpp -o myname
$ ./ myname
指定C++11标准:
g++ -g -Wall -std=c++11 main.cpp
2.声明typedef
typedef int dog;//支持安全检查,作用域块内
//增加dog为int的别名
#define dog int* //不支持检查,无作用域
#define WIDTH 5//#undef WIDTH可取消
#define MIN(a,b) (a<b ? a : b)//可定义参数宏define
#define MKSTR( x ) #x//可定义为字符串"x"
#define concat(a, b) a ## b//可定义为a*b
3.枚举enum
enum clolr {
red,green,blue} c;
c = blue;
enum color {
red, green=5, blue };//blue为6,red仍为0
4.同名时,使用::引用全局版变量,
::count//否则引用局部变量
5.宽字符常量
L’x’ 可存储于wchar_t类型的变量中
6.转义空格\t
可以输出空格
7.explicit,
防止构造函数的隐式转换发生;
Test t=12;//试图隐式转换,失败
Test t(12);//直接初始化,成功
8.static存储类
应用局部固定作用域内的值;
应用全局则将变量限制于该声明文件中。
9.thread_local 存储类
仅应用于数据声明和定义;不能用于函数声明或定义
10.^是异或,~是补码计算,<<是左移,>>右移
A = 0011 1100
B = 0000 1101
A&B = 0000 1100
A|B = 0011 1101
A^B = 0011 0001
~A = 1100 0011
A>>2= 0000 1111
A<<2= 1111 0000
A<<= 2//等同于 A=A<<2;
11.while (x --> 0);
其实等价于while( (x–) > 0 );
12.for范围循环
int my_array[5] = {
1, 2, 3, 4, 5};
for (int &x : my_array){
sth.}
13.Lambda 函数
[capture](参数) mutable->返回值{
body}//公式
auto add_x = [x](int a) mutable {
x *= 2; return a + x; };//示例
[](int x, int y){
return x < y ; }//标准示例
[]{
++global_x; }//无参数示例
[]{
};//最简单的示例
auto Myname = [] {
cout << "sth" << endl; };
Myname();//实用示例
注意:
Lambda 函数总是一个 const 函数,mutable 可以取消其常量性。
在使用该修饰符时,参数列表不可省略(即使参数为空)
[] // 沒有定义任何变量。使用未定义变量会引发错误。
[x, &y] // x以传值方式传入(默认),y以引用方式传入。
[&] // 任何被使用到的外部变量都隐式地以引用方式加以引用。
[=] // 任何被使用到的外部变量都隐式地以传值方式加以引用。
[&, x] // x显式地以传值方式加以引用。其余变量以引用方式加以引用。
[=, &z] // z显式地以引用方式加以引用。其余变量以传值方式加以引用。
14.对于[=]或[&]的形式,Lambda 表达式可以直接使用 this 指针。
但对于[]的形式,如果要使用 this 指针,必须显式传入:
[this]() {
this->someFunc(); }();
15.C++随机数
如要产生 [m,n] 范围内的随机数num,可用:int num=rand()%(n-m+1)+m;
(即 rand()%[区间内数的个数]+[区间起点值])
#include <time.h>
srand((unsigned) time(NULL)); /*播时间秒数种子*/
for(i = 0; i < 10; i++)
{
number[i] = rand() % 100; /*产生100以内的随机整数*/
printf("%d ", number[i]);
}
16.二维数组
int a[3][4] = {
{
0, 1, 2, 3} , /* 初始化索引号为 0 的行 */
{
4, 5, 6, 7} , /* 初始化索引号为 1 的行 */
{
8, 9, 10, 11} /* 初始化索引号为 2 的行 */
};
等价于int a[3][4] = {
0,1,2,3,4,5,6,7,8,9,10,11};
输出循环:
int a[i][j] = {
};
for ( int i = 0; i < 5; i++ )
for ( int j = 0; j < 2; j++ )
{
cout << "a[" << i << "][" << j << "]: ";
cout << a[i][j]<< endl;
}
17.数组指针
*(Arryname + x)等价于Arryname[x]
注意:
C++ 中,将 char * 或 char[] 传递给 cout 进行输出,
结果会是整个字符串,如果想要获得字符串的地址(第一个字符的内存地址),
可使用以下方法:
强制转化为其他指针(非 char*);
可以是 void *,int *,float *, double * 等;
- 使用 &s[0] 不能输出 s[0](首字符)的地址:
因为 &s[0] 将返回 char*,对于 char*(char 指针),
cout 会将其作为字符串来处理,向下查找字符并输出直到字符结束 *
18.常量字符串必须加const,以\0结尾
const char a4[7] = "something";//最后一位是'\0'
//直接初始化char数组是特殊的,这种初始化数组末尾字符以一个null结尾
19. vector动态向量容器
vector<int> vec;
//可使用诸如vec.size(),vec.push_back(i)
2维:
vector <int *> a
3维:
vector <int **> a
使用数组对其赋值:
第一种:vector<int> v( a, a+sizeof(a)/sizeof(a[0]) );
第二种:
int a[]={
1,2,3,4,5,6,7,8,9};
typedef vector<int> vec_int;
vec_int vecArray(a,a+9);
20.setw(int n)用来控制输出间隔,(n-1个空格)
cout<<setfill('*')<<setw(5)<<'a'<<endl;
输出:****a
21.动态分配数组
int MAX=10;
int *array=new int[MAX]{
1,2,3};
delete[] array;
22.获取数组长度遍历数组:
char* x[5] = {
(char*)"1", (char*)"2", (char*)"3", (char*)"4", "5" };
for (int i = 0; i < sizeof(x) / sizeof(char*); i++)
cout << x[i] << "\n";
23.字符串长度
cout<<strlen("123")<<endl; //返回 3
cout<<sizeof("123"