C++ 一些基础认识
面向对象程序设计包括:类的声明部分,类的使用部分。
结构, 联合和枚举类
c++ 中他们都是类型名, 和 c 语言不同:
enum Bool{FALSE, TRUE};
struct String {
char *str;
int length;
}:
union Number {
int i;
float j;
}:
c 语言定义变量时(需要带上关键字):
enum Bool done;
struct String str;
union Number x;
c++ 中定义变量时:
Bool done;
String str;
Number x;
const 修饰符
#define PI 3.14 // 只是单纯的文本替换
对比:
const float PI = 3.14;
void 指针
void 指针是一种通用型指针, 任何类型的指针值都可以赋给 void 类型指针.
void pa; // 错误, 不能声明void类型的变量
void *pc; // 正确, 可以声明void类型的指针
内联函数
inline double circle(double r) {}
带默认参数值的构造函数
void init(int x = 5, int y = 10);
编译器按照从左到右的顺序结合.
init(100, 50); // x = 100, y = 50
init(25); // x = 25, y = 10
init(); //x = 5, y = 10
函数重载
同一作用域中, 函数参数类型不同或参数个数不同, 或者两个情况都有, 函数名可以相同.
需要注意的地方:
函数返回值类型不在参数匹配检查之列, 若两个函数的参数个数和类型都相同, 只是函数返回值类型不同, 则不允许重载.
如下情况不允许:
int mul(int x, int y);
double mul(int x, int y);
函数重载与带默认值的函数在一起使用时, 可能引起二义性, 如:
声明:
void dra(int r = 0, int x = 1, int y = 2);
void dra(int r);
调用:
dra(20);
此时编译系统不知道调用哪一个.
函数调用, 实参和形参类型不符时编译器不能识别是哪一个.
原型:
void f(int x);
void f(double x);
调用:
int c_f(5.6);
此时, 编译器不能分辨将 5.6 转换成 int 还是 long, 导致不可分辨的错误.
作用域标识符 ::
相当于 C# 的 .
运算符。
强制类型转换
首先 c++ 支持 c 中的强制类型转换的用法, 例如:
int i = 10;
double x = (double)i;
另外, c++ 支持另一种格式, 类似于函数调用的格式:
int i = 10;
double x = double(i);
c++ 两种方法都支持, 推荐后一种.
new 和 delete:
计算机内存被分为 4个 区: 程序代码区, 全程数据区, 栈, 堆.
new 分配的基本形式:
指针变量名 = new 类型;
delete释放内存基本形式:
delete 指针变量名;
new为数组动态分配内存空间:
指针变量名 = new 类型名[下标表达式];
例如:
int *pi = new[10];
释放数组动态内存:
delete []指针变量名;
例如:
delete []pi;
new 给简单变量分配内存并初始化:
指针变量名 = new 类型名(初值);
例如:
int *p;
p = new int(99);
new 不能对动态的内存数组储存区进行初始化
引用
格式:
类型 &引用名 = 已定义的类型名;
例如:
int i = 5;
int &j = i; // &是引用声明符, 不代表地址. = 也不能理解为赋值
引用作为函数参数:
void swap(int &m, int &n) {}
引用作为函数的返回值:
#include
using namespace std;
int a[] = {1, 2, 3, 4, 5};
int &index(int);
int main() {
cout << a[2] << endl; // a[2]的原值
index(2) = 99;
cout << a[2] << endl; // 更改后a[2]的值
cin.get();
return 0;
}
int &index(int i) {
return a[i]; // 等价返回数据元素a[2]
}
输出:
3
99
对引用注意的地方:
- 不允许建立void类型的引用.
void &r = 10; // 错误
- 不能建立引用数组.
int a[4] = "abcd";
int &ra[4] = a; // 错误
见注释说明.
int n = 3;
int &&r = n; // 错误, 不能建立引用的引用
int &*p = n; // 错误, 不能建立指向引用的指针
- 可以将引用的地址赋值给一个指针, 此时指针指向的是原来的变量.
int a = 50;
int &b = a;
int *p = &b; // 指针相当于指向a, p保存的是a的地址
const加以限制.
int a = 50;
const int &b = a;
b = 3; // 错误, 不允许改变b的值
但是可以通过a改变, 如:
a = 10; // 可以
- 引用只在声明的时候带有引用运算符, 其他地方不带, 若出现 & 那是地址操作符.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了