zoukankan      html  css  js  c++  java
  • c++的重载 缺省参数和命名空间详解

    参加了几次笔试,发现有很多c++方面的问题被卡了。从现在开始进攻c++。之后会陆续更新c++学习笔记。
    先说说我学习的书籍,大家如果有好的书籍推荐,感谢留言。
    c++书籍
    暂时是在看这些书自学。

    1.C++介绍。

    c++介绍

    C几乎是C++的一个子集,所以C语言支持的语法在C++基本都支持并需要使用。C plus plus(C++),所以在C的基础上又有了很多新的特性。

    2.为什么C++支持重载?C语言不支持--重点

    先说说什么是重载:C++ 允许多个函数拥有相同的名字,只要它们的参数列表不同就可以,这就是函数的重载(Function Overloading)。借助重载,一个函数名可以有多种用途。
    举个例子

    
    void Func( )
    {
    	int x = 0, y = 0;
    	x = x + y;
    }
    void Func(int x, int y)
    {
    	int sum = x + y;
    }
    
    int main( )
    {
    	Func( );
    	Func(4,5);
    	return 0;
    }
    

    这就是函数重载。重载支持函数的参数列表不同。参数列表是指参数的类型和参数的个数。
    参数的类型有点不好理解。举个例子。

    func(int x,int y);
    func(int x,char y);
    func(char x,int y);
    

    上面三个函数相互构成重载。所以参数类型指的是两个函数的得参数对应位置的类型。
    再来说说为什么C语言不支持重载,而c++支持
    这个不许深入到底层去探个究竟,这里我们要看底层汇编代码(我们在linux平台下查看汇编代码,分别采用gcc和g++编译)gcc一遍自带,g++需要自己安装,安装只需输入:
    yum install gcc gcc-c++

    下面是执行过程:
    重载底层实现
    从图中可以看出,C语言和c++在底层的函数解析规则不同,导致C语言不支持从重载。

    3.缺省参数

    定义:就是在声明函数的某个参数的时候为之指定一个默认值,在调用该函数的时候如果采用该默认值,你就无须指定该参数。
    看个栗子:

    int Add1(int a, int b)
    {
    	return a + b;
    }
    
    int Add2(int a, int b = 1)
    {
    	return a + b;
    }
    
    
    int main( )
    {
    	printf("%d
    ",Add1(1, 2));
    	printf("%d
    ", Add2(1));
    	printf("%d
    ", Add2(1,2));
    	system("pause");
    	return 0;
    }
    

    看看结果
    这里写图片描述
    函数在定义时给了默认值,调用时如果传了参数就用实参,如果没传就用默认值。这个作用在后面学习类的构造函数很有用。
    当然缺省参数也有一定的规则:调用时你只能从最后一个参数开始进行省略,换句话说,如果你要省略一个参数,你必须省略它后面所有的参数,即:带缺省值的参数必须放在参数表的最后面。 缺省值必须是常量。显然,这限制了缺省参数的数据类型,例如动态数组和界面类型的缺省参数值只能是 nil;至于记录类型,则根本不能用作缺省参数。 缺省参数必须通过值参或常参传递。

    4.命名空间

    以关键字namespace开始,其后接命名空间的名字:

    namespace myname1
    {
    	int a = 1;
    }
    
    namespace myname2
    {
    	int a = 5;
    }
    
    

    命名空间的名字在其所在作用域中是唯一的,命名控件可以在全局作用域或者其它作用域内部定义,但是不能在函数或者类的内部定义。
    ▶每个命名空间都是一个作用域:
    这就不会出现C语言中的命名冲突问题。像上面的代码有两个变量a,但是不会出现命名冲突。
    ▶从命名空间外部使用命名空间成员:
    myname1::a;
    当我们使用该变量时要加上作用域限定符。
    ▶命名空间可以嵌套定义:

    namespace myname2
    {
    	int a = 5;
    	namespace myname3
    	{
    	int a = 10;
    	}
    }
    

    这样是可以的。
    以上运行结果:
    这里写图片描述

    注意:命名空间作用域不能以分号结束。

    专栏链接:https://blog.csdn.net/column/mycolumn.html

  • 相关阅读:
    Ida动态修改android程序的内存数据和寄存器数值,绕过so文件的判断语句
    Ida双开定位android so文件
    IDA调试android so文件.init_array和JNI_OnLoad
    超EASY 五步实现Eclipse ASN.1 SDK和插件安装
    记录重装系统的艰苦奋斗历程
    音标
    有道建昆老师~Reading Comprehensive
    Linux之普通用户用sudo建立文件和root用户建立的区别
    名句
    20200307(13)
  • 原文地址:https://www.cnblogs.com/zhonglongbo/p/8641872.html
Copyright © 2011-2022 走看看