C++ 进阶¶
该page将会从类开始介绍C++,类以及对象是C++不同于C的重要特性之一。 因为笔者所接受的教学主要以PPt演示为主,逻辑性一般,所以在此使用md来梳理记忆重要知识
重载¶
- 为什么C++有重载? 运算符重载:C++的运算符只支持基本的数据类型,但不支持自定义的数据类型
!!! tip 一些不能重载的情况: - 类与对象: 析构函数不能够重载(没有返回值); 定义的拷贝构造函数中的形式参数不能够重载;
函数重载¶
函数重载实际上就是不同函数使用同一个名字
基本规则是:
- 重载函数至少有一对参数类型不同
- 重载函数的参数个数不同
//一个正确的情况
void printstar();
void printstar(int,int);
void printstar(int,double);
//一个会引起二义性的情况
float add(int a,int b);
int add(int a,int b,int c = 0);
add(1,2)//该函数不知道调用哪一个函数
运算符重载¶
这个比较简单直接,记忆模板就可以了
typename opeartor (+) (typename a,int b)//左边定义类型,右边基本类型
{
//函数主体,就是+的内涵扩展
}
动态内存分配¶
Note
动态分配一个变量:
int *p = new int(3);
new
+数据类型
+(初始值)
动态分配一个数组:
int *p = new int[n];//n可以是变量,p是指向首元素的指针
- 使用的基本流程:
1. 判定是否分配成功
int n;
cin>>n;
int *p = new int[n];
if(p == NULL) return 0;
new
对应 delete
new[]
对应 delete[]
注意 ⚠️:动态分配的内存空间的地址被修改,
delete
时会报错
int *p = new int[20];
for(int i = 0;i<20;i++)
{
*p = i;
p++;//error's reason
}delete []p;//error!
!!! question 如何保证动态内存分配浪费的空间最少?
动态分配与结构体¶
具体细节参考下面的代码解析
struct student{
char name[30];
int id;
};
student* p = new student[30];
cin>>(p+1)->id>>(p+1)->name;
cout<<(p+1)->id<<" "<<(p+1)->name<<endl;
动态分配与二维数组¶
具体细节参考下面的代码解析
int m,n;cin>>m>>n;
int **pp = new int*[m];//apt to be wrong!
for(int i = 0;i<m;i++)
{
pp[i] = new int[n];
}//build 2-d array
if(pp == NULL) {cout<<"ERROR!"<<endl;return 0;}
for(int i = 0;i<m;i++)
{
for(int j = 0;j<n;j++)
{
cin>>pp[i][j];
}
}//write in 2-d array
int *diger = &pp[0][0];
for(int i = 0;i<m*n;i++)//如果你理解数组在内存中的分配关系,那么他就是一维数组
{
cout<<(int)*(diger+i)<<" ";
}//pop out 2-d array
for(int i = 0;i<m;i++)
{
delete [] pp[i];
}
delete [] pp;//clear 2-d array
!!! note 延伸:动态生成锯齿数组
int m,n;cin>>m>>n;
int **pp = new int*[m];//apt to be wrong!
pp[0] = new int[3];
pp[1] = new int[2];
类和对象¶
笔者不再赘述关于类的定义以及基础的构成
类的初始化及方法¶
-
通过默认值初始化
-
通过初始化列表初始化
//如果类的数据成员是公有的,可以使用初始化列表进行初始化
class address{
public:
long telenum;
char addr[30];
};
class person{
public:
char name[15];
int age;
address paddr;
};
person p1 = {"Zhang hua",23,{2475096,"Nankai University"}}
- 通过构造函数初始化