1 Star 0 Fork 0

方温南/学习文档

加入 Gitee
与超过 1400万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
C-C++ 6.12 KB
一键复制 编辑 原始数据 按行查看 历史
方温南 提交于 2023-01-31 23:34 +08:00 . english
C
1.const修饰全局变量,变量名只读,内存空间在文字常量区(只读),不能通过num的地址,修改空间内容
2.const修饰局部变量,变量名只读,内存空间栈区(可读可写),可以通过地址间接的修改空间内容
C++
1.
尽量用const替换#define
区别:
1.const有类型,可进行编译器类型安全检查,#define无类型,不可进行类型检查
2.const有作用域,而#define不重视作用域,宏的作用域是整个文件,const的作用域以定义情况决定
3.宏不能作为命名空间的成员,const可以
内联函数
因为宏函数有问题,所以C++函数有不方便的地方,所以有了C++的内联函数
宏不能保证代码完整性,以空间换时间
任何类内部定义的函数都是内联函数
内联函数为了继承宏函数的效率,没有函数调用的开销,然后又可以像普通函数那样,可以进行参数,返回值类型的安全检查,又可以作为成员函数
是一个真正的函数,函数的替换发生在编译阶段
函数默认参数
函数的默认参数从左向右,如果一个参数设置了默认参数,那么这个参数之后的参数都必须设置默认参数,之前的可以.
(int x,int y=10) ->可以
(int x=10,int y) ->不可以
如果函数声明和函数定义分开写,函数声明和函数定义不能同时设置默认参数,建议函数声明处设置默认参数定义
占位参数
占位参数:只有类型,没有形参名
由于有类型名,所以函数调用的时候必须给占位参数传参
由于没有形参名,所以函数内部是无法使用占位参数的
void func03(int x,int y,int){
cout << "x="<<x<<"y="<<y<<endl;
}
函数重载会用到这个
函数重载
体现的是C++的多态
定义:
同一个函数名在不同场景下可以具有不同的含义
函数重载意义:
方便使用函数名
重载的条件:
同一个作用域,参数个数不同,参数类型不同,参数顺序不同
注意:
1.函数的返回值类型不能作为函数重载的依据
2.函数重载和默认参数一起使用,需要额外注意二义性问题的产生
意义:
让函数调用多样化
编译器工作:
使用不同的参数类型修饰函数名
cpp和c混合编程
构造函数分类
按参数类型:分为无参构造函数和有参构造函数
按类型分类:普通构造函数和拷贝构造函数(复制构造函数)
构造函数的调用
无参构造的调用形式
1.调用无参或默认构造(隐式调用)
Data ob;
2.调用无参构造(显式调用)
Data ob2 = Data();
3.调用有参构造(隐式调用)
Data ob3(10);//ob3.Data(10);
4.调用有参构造(显式调用)
Data ob4 = Data(100);
5.隐式转换的方式,调用有参构造(针对于一个数据成员)
Data ob5 = 30//Data ob5 = (30);
6.匿名对象(当前语句结束,匿名对象立即释放)
Data(100);
拷贝构造函数
系统也会提供一个拷贝构造函数,赋值操作
注意:
同一作用域,构造和析构的顺序相反
旧对象初始化新对象,才会调用拷贝构造
构造函数的调用规则
系统会对任何一个类提供3个函数成员函数
默认构造函数,默认析构函数,默认拷贝构造函数
深拷贝和浅拷贝
浅拷贝一般情况下没有副作用,但是当类中有指针,并且指针指向动态分配的内存空间,析构函数做了动态内存释放的处理,会导致内存问题
const int* p = &a;
当把 const 放最前面的时候,它修饰的就是 *p,那么 *p 就不可变。*p 表示的是指针变量 p 所指向的内存单元里面的内容,此时这个内容不可变。其他的都可变,
如 p 中存放的是指向的内存单元的地址,这个地址可变,即 p 的指向可变。但指向谁,谁的内容就不可变。
这种用法常见于定义函数的形参。
内容不可变,指向可变。
int* const p = &a;
此时 const 修饰的是 p,所以 p 中存放的内存单元的地址不可变,而内存单元中的内容可变。即 p 的指向不可变,p 所指向的内存单元的内容可变。
const int* const p = &a;
此时 *p 和 p 都被修饰了,那么 p 中存放的内存单元的地址和内存单元中的内容都不可变。
综上所述,使用 const 可以保护用指针访问内存时由指针导致的被访问内存空间中数据的误更改。因为指针是直接访问内存的,没有拷贝,而有些时候使用指针访问内存
时并不是要改变里面的值,而只是要使用里面的值,所以一旦不小心误操作把里面的数据改了就糟糕了。
指针和函数
栈帧
当函数调用时,系统会在stack空间上申请一块内存区域,用来供函数调用,主要存放形参和局部变量
当函数调用结束,这块内存区域自动被释放
传值和传址
传值:函数调用期间,实参将自己的值,拷贝一份给形参
传址:函数调用期间,实参将地址值,拷贝一份给形参
指针做函数参数
调用时,传有效的地址值
数组做函数参数
数组作函数参数时,传递的不是整个数组,而是数组的首地址(一个指针的大小)
所以当整型数组做函数参数时,我们通常封装两个参数,一个表数组首地址,一个表元素个数
指针做函数返回值
指针做函数返回值,不能返回局部变量的地址值
数组做函数返回值
c语言不允许
指针和字符串
char str1[] = {'h','i','\0'};常量,可读可写
char str2[] = "hi";常量,可读可写
char *str3 = "hi";常量,只读
char *str4 = {'h','i','\0'};//错误
当字符串(字符数组),做函数参数时,不需要提供两个参数,因为每个字符串都有'\0'
带参数的main函数
无参main函数,int main(void) = int main()
带参数的main函数,int main(int argc,char *argv[])=int main(int argc,char **argv)
参数1:给main函数传递的参数总个数
参数2:是一个数组,数组的每一个元素都是字符串(char*)
开辟释放heap空间
void *malloc(size_t size):申请size大小的空间
返回实际申请到的内存空间首地址,我们通常拿来当数组用
void free(void *ptr):释放申请的空间
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
Java
1
https://gitee.com/nanwenfang/learning_documents.git
git@gitee.com:nanwenfang/learning_documents.git
nanwenfang
learning_documents
学习文档
master

搜索帮助