C++笔记(一)
一、基础知识
1.1、函数重载
- 同名不同参
- 本质是编译时修改了函数名,name mangling
1.2、默认参数
int add(int a=1,int b=2){ //默认参数为1和2,不传对应实参时使用默认参数
return a+b;
}
-
如果声明和实现分离,默认参数只能放在声明处 -
默认参数从右边开始填入;
int add(int a,int b)
{
return a+b;
}
- 函数重载和默认参数会产生冲突,优先选择默认参数;
- 本质:有实参就push实参,没有就push默认参数;
1.3、extern ”C“
- 被extern ”C“修饰的代码会按照C语言的方式去编译;
extern "C"{
void func(){
}
void func(int a){ //第二个func会编译报错,因为C编译不允许函数重载
}
}
- 声明和实现分离时,只允许在声明处加 extern “C”
#include<iostream>
using namespace std;
extern "C" void func();
int main()
{
func;
return 0;
}
func(){
cout<<"func"<<endl;
}
- 在C++中使用C编译的函数,在头文件函数声明处加上extern ”C“即可;在.c文件中若要使用extern "C"修饰的函数,则需要在声明处再加上如下的宏定义:
#ifdef _cplusplus
extern "C"{
#endif
void func();
#ifdef _cplusplus
}
#endif
1.4、宏定义
#ifndef _TEST_H //防止头文件内容被重复包含
#define _TEST_H
...
#endif //受c/c++标准支持,不受任何编译器限制 //可以控制部分代码
#pragma once //防止文件被重复保护 //较老编译器不支持,兼容性不够好 //对整个文件生效
1.5、inline
编译会将函数调用展开为函数体代码,免于开辟栈空间,减少函数调用开销;但增大了代码体积;递归不必用内联
注意:内联函数中调用内联函数自身并不会将被调用的函数进一步展开
1.6、const
- 意为常量,被修饰变量值不能修改
- 如果修饰的是类、结构体(的指针),其成员也不可以更改;
const int *p=&age; //*p is const
int const *p=&age; //*p is const
int * const p=&age; //p is const
const int * const p=&age; //p and *p are const
1.7、引用
int age = 10;
int &refage = age;
refage = 20; //age 10->20
- 创建引用时必须初始化,并且之后无法再将它指向其他变量----》比指针安全,不会指向不明地址处;
- 可以使用引用为另一个引用初始化,相当于为同一个变量创建了多个别名;
int age = 10;
int &ref1 = age; //ref1=age
int &ref2 = ref1; //ref2=age
- 本质是指针,编译器弱化了它,弱化指针。在汇编代码和机器码中可以看到两者是一样的;
- 指针的sizeof()。x86是32位机器,结果是4字节;x64是64位机器,结果是8字节;
- 野指针是指向被回收内存地址的指针;
1.8、汇编语言
1、
8086汇编(16bit)
x86汇编(32)
x64(64)
ARM(嵌入式、移动设备)
……
x64汇编根据编译器不同,有两种书写格式:
intel: windows
AT&T : mac 、linux
2、汇编不区分大小写
|