C++入门学习_01

C++基础学习_01

基础知识:1.命名空间,2.IO流(输入输入),3.参数缺省,4.函数重载

1.命名空间

  作用:对标识符的名称进行本地化,避免命名冲突

  定义:namaspace space_name { 空间成员}

     空间成员可以是定义变量,也可以是定义函数

  特点:可独自命名,可进行空间嵌套,可分段定义

  注意:分段定义时,允许命名空间的名称相同,但是空间成员不能相同,因为编译器会将命名空间名称相同的合并到一起,空间成员如有相同则会产生重定义

  使用:作用域限定符---" :: ''

     1>空间名称 作用域限定符 空间成员

     2>使用using 将命名空间的成员引入

      using space_name :: space_number; ---将space_name空间中指定的空间成员展开到当前的作用域中

     3>使用using namespace 空间名称   // 将空间名称引入

      using namespace space_name; ---将space_name空间中所有的空间成员都展开到当前的作用域中<不推荐使用,容易产生命名冲突>

  使用说明:使用using 会将命名空间中的空间成员展开到当前作用域

       若当前作用域为全局域,则可以全局范围使用

       若当前作用域为局部域,则只能在局部范围使用

// 单独使用
namespace a1{
    int a = 10;
    int Add(int x, int y){
        return x + y;
    }
}
// 分段使用
namespace a1{
    int b = 10;
    int Sub(int x, int y){
        return x - y;
    }
}
// 嵌套使用
namespace a2{
    int a = 10;
    int Add(int x, int y){
        return x + y;
    }
    namespace a3{
        int c = 20;
        int Sub(int x, int y){
            return x - y;
        }
    }
}
int main(){
    // 命名空间的使用
    a1::b;
    a1::Sub(10, 20);
    return 0;
}

2.IO流(输入输出)

  使用cout标准输出(控制台)与cin标准输入(键盘)时,必须包含头文件<iostream>和std标准命名空间;

  头文件:#include<iostream>

  输出流  cout

    int a = 10;

    int b = 20;

    std::cout << "a = " << a << "\n";

    std::cout << "b = " << b << "\n";

  输入流  cin

    char a;  int b;  double c;

    std::cin >> a >> b >> c

    可以分开流入,也可以直接流入

  可以看出cout、cin都需要std::引用,所以它们属于std命名空间中的空间成员,可以在全局域中直接展开

  eg  usinf std::cout;

    cout << "Hello world\n";

    cin >>a >>b >> c;

3.缺省参数

  定义:在定义或声明一个函数时,为形参设置一个默认值,如果没有进行传参,函数将会默认使用提前设置好的形参默认值

  

using std::endl;

void func(int a = 10){
    cout << a << endl;
}

int main(){
    cout << "未传形参值\n";
    func();
    cout << "传形参值\n";
    func(20);
    return 0;
}

  根据参数默认值是否完全设置,可以分为:全缺省参数和半缺省参数

  需要注意:

    1.半缺省参数必须从右往左给出,不能间隔给出

    2.缺省参数不能在函数声明和定义中同时出现

    3.缺省参数值必须是常量或全局变量

using std::endl;

// 全缺省参数
void func_1(int a = 10, int b = 20, int c = 30){
    cout << "a = " << a << endl;
    cout << "b = " << b << endl;
    cout << "c = " << c << endl;
}

// 半缺省参数
void func_2(int a, int b = 20, int c = 30){
    cout << "a = " << a << endl;
    cout << "b = " << b << endl;
    cout << "c = " << c << endl;
}

4.函数重载

  1-函数重载(搞不好就会函数重定义)

    同名函数的形参列表必须不同:参数类型不同 或 参数个数不同 或 参数顺序不同

    <1>void fun_1(int a);

    <2>void fun_1(int a, int b);

    <3>int fun_1(int a, int b);

    <1><2>构成函数重载,<3>与<2>构成函数重定义

    说明:函数修饰符不影响函数重载,也就是说函数重载只看形参列表的区别

  2-函数名修饰规则 以Linux系统下显示结果进行说明

   函数名修饰时,<从左往右>以参数类型的第一个字符开头进行修饰

  

  3-extern "C"  一般用于C/C++混合编译时声明

    告诉编译器,将该函数按照C语言编译规则进行编译

  

// 用于声明函数风格为C风格
extern "C" int Add(int x, int y){
    printf("x + y = ");
    return x + y;
}

int main(){
    Add(1, 2);
    return 0;

 

思考几个问题:

  1.什么情况下两个函数才能形成函数重载?

    函数名相同,而形参列表不同。不同之处在于:类型不同 或 个数不同 或 顺序不同

  2.C语言为什么不支持函数重载?

    C语言编译器底层对函数名称修饰过于简单,只是进行函数名下划线处理,不会形成函数重载,只会是重定义

  3.C++中函数重载底层是怎么处理的?

    利用函数的形参类型、个数、顺序的不同,使用每个形参的类型的首个字符进行组合形成“修饰符”

    利用三者的不同,可以组合成不同的“修饰符”,来对函数名进行修饰,使之不会发生函数名冲突

  4.C++中能否将一个函数按照C风格来编译?

    可以,必须对函数进行 extern "C" 声明

posted @ 2019-04-25 12:39  冲锋的蜗牛  阅读(195)  评论(0编辑  收藏  举报