目录
记录C++的一些基本语法特性
一、申请内存
1.1 与C对比
c | malloc | (type*)malloc() | 开辟内存,强制转化数据类型 |
---|---|---|---|
c++ | new | new int(10) | 在开辟内存的时候可以赋值,并且返回该数据类型的指针 |
1.2 开辟与释放数组
释放数组时不同
int * arr = new int[10]; // 开辟数组
delete[] arr; // 释放数组,delete后面加个中括号[]
二、引用(也是C的特性)
2.1 引用的基本语法
int a = 10;
// 实际上等于int * const ref = &a,并且是const,所以这个指针的指向不能变,即ref只能指向这一个地址
int &b = a; /* c++中的引用语法,相当于给a起了一个别名,类似于python的b = a,对象b本身没有单独分配内存空间它指向计算机中存储对象a的内存*/
b = 20;
cout<< "a=" << a << endl; // a=20
2.2 函数与引用
1.引用作形参
void abSwap(int &a1, int &b1) // 给a和b起了一个别名
{
int temp = a1;
a1 = b1;
b1 = temp;
}
int main(void)
{
int a = 10;
int b = 30;
abSwap(a,b);
cout<< "a=" << a << endl; // a=30
cout<< "b=" << b << endl; // b=10
}
- 引用作函数返回值
int & test1() // 给a和b起了一个别名
{
int a1 = 10;
return a1;
}
int & test2()
{
static int a2 = 20; // 静态变量(存放在全局区),所以这个返回引用时,不会被接着释放
return a2;
}
int main(void)
{
int &a_1 = test1();
cout<< "a_1=" << a_1 << endl; // a=10
cout<< "a_1=" << a_1 << endl; /* 会打印地址,因为局部变量在执行完函数后会被释放,所以test1返回了一个局部变量a1的引用
虽然main中a指向了a1的地址,但是a1在执行完局部函数后被释放了,第一次能打印出来因为编译器做了保留
(那要是换个编译器呢?)*/
int &a_2 = test2();
cout<< "a_2=" << a_2 << endl; // a=20
cout<< "a_2 =" << a_2 << endl; // a=20,仍然会打印出来,因为静态变量是存放在全局区,所以子函数调用完后也没有释放。
test2() = 30;
cout<< "a_2=" << a_2 << endl; // 30
}
三、函数重载(C也有,但是需要使用GCC 的内置函数,麻烦)
void func(int a, double b)
{
cout<< "func(int a, double b)" <<endl;
}
void func(int a)
{
cout<< "func(int a)" <<endl;
}
void func(double a, int b)
{
cout<< "func(double a, int b)" <<endl;
}
int main(void)
{
// 函数重载,可以有相同的函数名,只要同名函数在同一作用域下,且参数个数不同、类型不同,或者相同个数相同类型但是顺序不同
// 尽量不要使用默认参数
func(1, 2.2);
func(2);
func(2.2, 1);
}