C++ 命名空间 函数重载 引用 内联函数

C++关键字(C++98) 有63个

命名空间解决了:名字冲突,有作用域的作用

命名空间的使用格式:

namespace N1
{
    1.变量
    2.函数
    3.命名空间(嵌套使用)
}

使用方法
1. N1::变量
2. using N1::变量;
3. using namespace N1;


C++的输入输出

头文件:iostream

命名空间:using namespace std;

使用:

int a;
cin>>a;
cout<<"hello"<<endl;
//十六进制打印
cout<<hex<<a<<endl;

缺省参数
void test(int a = 0)
{
    cout<<a<<endl;
}

int main()
{
    test(10);
    test();
    return 0;
}

全缺省参数

如果没有传递对应参数,则用默认缺省值

传参的时候从右往左传递(约定的)

半缺省参数

部分参数带有缺省值

++注意++:

半缺省参数应该要从右边开始给,不能有空一个参数,即从右往左参数要连续赋值

不能这样写:

void test(int a = 1, int b , int c = 3)

这样是对的:

void test(int a, int b = 2, int c = 3)
{
    //对于这种形式,没有缺省参数的必须要在函数的实现中给他赋值
    test(10);
    test(10,20);
    test(10,20,30);
    //所以下面这种方式是错误的
    test();
}

注意

缺省参数不能再函数声明和定义中同时出现,写在函数声明中即可

缺省值必须是常量或者全局变量


函数重载

++在同一作用域++声明几个功能类似的同名函数

**这些同名函数的形参列表(参数个数、类型、顺序)必须
不同,常用来处理实现功能类似数据类型不同的问题**

简记:作用域相同,函数名相同,参数不同,仅仅是函数的返回值类型不同是无法构成重载的

int add(int a, int b)
{
    return a+b;
}

double add(double a, double b)
{
    return a+b;
}

编译器会识别参数类型,来调用匹配的函数

C和C++对同名函数处理:

注:C不支持函数重载

C:在函数名前加了一个下划线

C++:(?add@@YA HHD @Z)

HHD 代表返回值,参数一的类型,参数二的类型

C++还考虑了参数的类型,所以C++支持函数重载,而C语言不支持。

在C++工程中按照C的风格来编译:

extern "C" int add(int a,int b);

引用

引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间。

注意:引用类型必须和源数据类型相同

引用在定义时必须初始化

一个变量可以有多个引用

引用一旦引用一个实体,再不能引用其他实体

常引用
const int a = 10;
const int& ra = a;

const int& r = 10;

double d = 12.34;
const int& rd = d;//这时 d 和 rd 的地址不一样了

//数组的引用
int arr1[10];
int (&rarr1)[10] = arr1;
rarr1[0] = 10;

double d = 12.34;
const int& rd = d;//这时 d 和 rd 的地址不一样了

解答:数据会被截断,放到另一个临时空间,rd已经是临时空间的别名了

传引用交换两数

void Swap(int& left, int& right)
{
int temp = left;
left = right;
right = temp
}

如果不想改变外部实参

可以加入const

void fun(const int& a);
注意
int& test()
{
    int a=0;
    return a;
}

int main()
{
    int& ra = test();
    cout<<ra<<endl;//10
    cout<<ra<<endl;//随机值
    return 0;
}

解决方法:将int a=0;做成全局变量,即移到函数外或者

int& test(int& a)
{

    return a;
}

int main()
{
    int a=0;
    int& ra = test(a);
    cout<<ra<<endl;//10
    cout<<ra<<endl;//随机值
    return 0;
}

引用和指针的相同点

引用和指针在底层的处理方式都是一样的。

引用形式指针形式
T&T* const
const T&const T* const

引用和指针的不同点

  1. 引用在定义时必须初始化,指针没有要求
  2. 一旦一个引用被初始化为指向一个对象,就不能再指向其他对象,而 指针可以在任何时候指向任何一个同类型对象
  3. 没有NULL引用,但有NULL指针
  4. 在sizeof中含义不同:引用结果为引用类型的大小,但指针始终是地 址空间所占字节个数
  5. 引用自加改变变量的内容,指针自加改变了指针指向
  6. 有多级指针,但是没有多级引用
  7. 指针需要手动寻址,引用通过编译器实现寻址
  8. 引用比指针使用起来相对更安全

内联函数

用inline修饰,在程序编译时,使用内联函数的会自动展开

inline int add(int a, int b)
{
    return a+b;
}

int main()
{
    int a=1;
    int b=2;
    cout<<add(a,b)<<endl;
    return 0;
}

在debug模式下,实际发现并没有展开,还是调用函数(call)

在release模式下,查看汇编代码,有push 3;说明直接计算出了结果。将结果替换了

在release模式下,编译器会大量优化。

一般在debug模式下,不会进行优化

inline 以空间换时间

当出现递归或者很长的循环时,或者代码太长,则会忽略inline,inline对编译器只是一个建议


C++中替代宏的方法:

常量定义 换用 const
函数定义 换用 内联函数
类型重定义 换用 typedef

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值