文章主要用于记录C++中与C的不同之处
new的基本用法
C++中利用new操作符在堆区开辟数据
堆区开辟的数据由程序员手动开辟和释放,释放利用操作符delete
#inlude <iostream>
using namespce std;
int *func()
{
//在堆区创建整型数据
//new返回是该数据类型的指针
int *p = new int(10);
return p;
}
void test01()
{
int *p1 = func();
delete p;
}
void test02()
{
//在堆区利用new开辟数组
int *arr = new int[10];
for (int i = 0;i < 10 ; i++)
{
arr[i] = i + 100; //给10个元素赋值 100~109
}
for (int i = 0; i < 10 ; i++)
{
cout<<arr[i]<<endl;
}
delete [] arr; //释放数组
}
引用
作用:给变量起别名
语法:数据类型 &别名 = 原名
例如:
int a = 10;
int &b = a;
b = 20;
cout << a <<endl; //a = 20
引用的注意事项
- 引用必须初始化
例如:
int &b;//是错误的,不能只声明没有初始化
- 引用在初始化后不可改变
引用做函数参数
作用:函数传参时,可以利用引用让形参修饰实参
优点:可以简化指针修改实参
/***引用传递***/
void mySwap(int &A, int &B) //使用引用的方式通过了别名A接收了a,B同理
{
int temp = A;
A = B;
B = temp;
}
int main()
{
int a = 10;
int b = 20;
mySwap(a,b); //引用传递,形参也会修饰实参
}
引用做函数返回值
作用:引用是可以作为函数的返回值存在的
注意:不要返回局部变量引用
//引用做函数的返回值
//不要返回局部变量的引用!!
int& test01() //为了用函数引用&test01来接一个新的引用&ref
{
int a = 10; // 局部变量存放在栈中
}
//返回静态变量引用
int& test02()
{
static int a = 10; //静态变量存在全局区
return a; //返回a的引用,把a变量作为返回
}
int main()
{
int &ref = test01();
cout << "ref = " << ref << endl; //第一次结果正确,是因为编译器做了保留
cout << "ref = " << ref << endl ;// 第二次会出现错误
int &ref2 = test02();
cout << "ref2 = " << ref2 << endl;
test02() = 1000; // 等同于 a = 1000; test02返回的是a的引用
//r如果函数的返回值是引用,这个函数的调用可以为左值
cout << "ref2 = " << ref2 << endl;
//静态变量本身和它的所有引用指向同一个内存空间,对变量和其任意一个引用赋值均会改变该地址上的值
}
引用的本质
本质:引用的本质在C++内部实现按时一个指针常量(即 xxx *const p,指针的指向不可更改,指向的内容可以修改)
void fun(int &ref) //发现是引用,转换为 int *const ref = &a;
{
ref = 100; //ref是引用,转换为 *ref = 100
}
int main()
{
int &ref = a;
ref = 20; //内部发现ref是引用,自动帮我们转换为: *ref = 20;
}
函数重载
函数重载概述:
作用:函数名可以相同,提高复用性
函数重载满足条件:
- 同一个作用域下
- 函数名称相同
- 函数参数类型不同 或者个数不同加粗样式 或者顺序不同
**注意:**函数的返回值不可以作为函数重载的条件
void func()
{
cout << "func的调用" << endl;
}
void func(int a)
{
cout << "func(int a)的调用" << endl;
}
int main()
{
func();
return 0;
}
函数重载得注意事项
- 引用作为重载条件
- 函数重载碰到函数默认参数
void func(int &A) //int &a = 10; 不合法
{
cout << "func(int &A)调用" << endl;
}
void func(const int &A) //const int &a = 10;合法
{
cout << "func(const int &A)调用" << endl;
}
void func1(int a)
{
cout << "func1(int a)调用" << endl;
}
void func1(int a, int b = 10)
{
cout << "func1(int a, int b = 10)调用" << endl;
}
int main()
{
int a = 10;
func(a); //调用的是第一个函数
func(10); //调用第二个函数
func1(10); //当函数重载碰到默认参数出现二义性,报错,尽量避免,
}