目录
new运算符
new关键字的使用案例
C++的引用
C++中引用案例
引用的注意事项
引用做函数参数
引用做函数的返回值
前言:
具体案例
引用的本质
常量引用
常量引用原理
经典案例
函数的提高
函数的默认参数
注意:
具体案例
函数的占位参数
具体案例
函数的重载
函数重载满足的条件
函数重载的注意事项
引用作为重载的条件
函数重载碰到函数默认参数
new运算符
前言:C++中利用new操作符程序员可以在堆区手动开辟数据空间;程序员也可以手动释放空间,释放空间利用操作符delete
开辟空间语法:new 数据类型
返回值:该数据对应类型的指针
释放空间语法:delete 要释放的地址;
开辟数组语法:new 数据类型[数组长度]
返回值:对应开辟出数组空间的首地址(指针)
释放数组空间语法:delete[] 要释放的地址;
new关键字的使用案例
#include <iostream>
using namespace std;
int* func() {
//在堆区创建空间
int* p = new int(10);
return p;
}
void testArr() {
//在堆中创建长度为10的整形数组
int* arr = new int[10];
for (int i = 0; i < 10; i++) {
//给10个元素赋值
arr[i] = i + 100;
}
for (int i = 0; i < 10; i++) {
cout << arr[i] << endl;
}
//释放数组空间地址
delete[] arr;
}
void main() {
testArr();
int* p = func();
cout << "a的值为:" << *p << endl;
cout << "a的值为:" << *p << endl;
//堆内释放地址
delete p;
//内存已经被释放,再次访问就是非法操作
cout << "a的值为:" << *p << endl;
}
C++的引用
作用:给变量起别名
语法:数据类型 &别名=原名
C++中引用案例
#include <iostream>
using namespace std;
void main() {
//引用的基本语法
int a = 10;
int &b = a;
b = 20;
cout << "a的值为:" << a << endl;//20
cout << "b的值为:" << b << endl;//20
system("pause");
}
引用的注意事项
- 引用必须要初始化(必须要告诉引用的是谁,如:int &b;是不正确的)
- 引用一旦初始化后就不可以更改
理解:变量名本身就是自己所表示的值的一块内存空间,值的地址表示变量,因此,值与别名在某种意义上是等价的,所以引用必须要初始化,并且初始化后便不可更改
引用做函数参数
作用:函数传参时可以利用引用的技术让形参修饰实参
#include <iostream>
using namespace std;
void swap(int &a,int &b) {
int temp = a;
a = b;
b = temp;
}
void main() {
int a = 10;
int b = 20;
swap(a, b);
cout << "a的值为:" << a << "\tb的值为:" << b << endl;
system("pause");
}
结果:由此观之,引用传递,那么形参的改变会影响实参
引用做函数的返回值
前言:
- 引用是可以作为函数返回值存在的
- 不要返回局部变量的引用
- 引用的返回值类型:数据类型&
- 返回值为引用类型的函数那么其调用可以作为左值
具体案例
#include <iostream>
using namespace std;
//以引用的形式返回a
int& change() {
//全局区的变量a
static int a = 10;
return a;
}
void main() {
int &ref = change();
//10
cout << "ref的值为:" << ref << endl;
cout << "ref的值为:" << ref << endl;
system("pause");
}
#include <iostream>
using namespace std;
//以引用的形式返回a
int& change() {
//全局区的变量a
static int a = 10;
return a;
}
void main() {
int &ref = change();
//相当于将a的引用赋值为1000
change() = 1000;
//因为ref为a的引用所以也为1000
cout << "ref的值为:" << ref << endl;
system("pause");
}
结论:若函数返回值类型为引用类型,则其函数调用可以作为左值
引用的本质
本质:在C++内部实现是一个指针常量
结论:C++推荐使用引用技术,因为语法方便,引用的本质是指针常量,但是所有的指针操作编译器都帮助我们做了
常量引用
作用:常量引用主要用来修饰形参,防止误操作
常量引用原理
#include <iostream>
using namespace std;
void main() {
//加上const后,编译器将代码改为:int temp=10; int& ref=temp;
const int& ref = 10;
//下面报错,加了const后引用的值不可更改
//ref = 20;
cout << "ref的值为:" << ref << endl;
system("pause");
}
注意:加了const后,那么被引用的别名值不可被更改
经典案例
#include <iostream>
using namespace std;
void showValue(const int& a) {
//这里形参到的改变会影响实参,因此加const来防止误操作
cout << "a的值为:" << a << endl;
}
void main() {
int a = 100;
showValue(a);
system("pause");
}
函数的提高
函数的默认参数
前言:在C++中函数的形参列表中的形参是可以有默认值的
语法:
返回值类型 函数名(参数=默认值){
函数体;
}
注意:
- 若某个位置已经有了默认值,那么从这个位置往后,从左到右都必须有默认值
- 若函数的声明有默认参数,那么函数的实现就不能有默认参数(函数的声明和函数的实现只能有1个有默认参数)
- 调用函数传递的实参从左到右依次与形参一一匹配,其中传入的参数会覆盖掉对应位置的默认值
具体案例
#include <iostream>
using namespace std;
int add(int a, int b=20, int c=30) {
return a+b+c;
}
void main() {
int sum=add(10);
cout << "sum等于:" << sum << endl;//60
system("pause");
}
函数的占位参数
C++中函数的形参列表里可以有占位参数,用来做占位,调用函数时必须填补该位置
语法:
返回值类型 函数名(数据类型){
函数体;
}
注意:占位参数也可以有默认值
具体案例
#include <iostream>
using namespace std;
//占位参数
void func(int a,int) {
cout << "占位参数实例!" << endl;
}
void main() {
//占位参数函数的调用
func(10, 20);
system("pause");
}
#include <iostream>
using namespace std;
//占位参数的默认参数
void func(int a,int =10) {
cout << "占位参数实例!" << endl;
}
void main() {
//占位参数函数的调用
func(10);
system("pause");
}
函数的重载
含义:函数名相同,但参数列表不同,进而提高函数的复用性
函数重载满足的条件
- 同一个作用域下
- 函数名称相同
- 函数参数类型不同或者参数个数不同,或者参数顺序不同
注意:函数的返回值不可以作为函数重载的条件的
#include <iostream>
using namespace std;
void func() {
cout << "func的调用:" << endl;
}
void func(int a) {
cout << "func(int a)的调用:"<<a<< endl;
}
void main() {
func();
func(10);
system("pause");
}
函数重载的注意事项
引用作为重载的条件
#include <iostream>
using namespace std;
void func(int &a) {
cout << "func(int &a)的调用:" << endl;
}
void func(const int &a) {
cout << "func(const int &a)的调用:"<<a<< endl;
}
void main() {
int a = 10;
//调用第一个
func(a);
//调用第二个
func(10);
system("pause");
}
函数重载碰到函数默认参数
#include <iostream>
using namespace std;
void func(int a,int b=10) {
cout << "func(int a,int b=10)的调用:" << endl;
}
void func(int a) {
cout << "func(int a)的调用:"<< endl;
}
void main() {
int a = 10;
//若传一个参数的话会出现二义性
func(10,20);
system("pause");
}
注意:当函数重载碰到默认参数时,会出现二义性,报错,应尽量避免这种情况