C++初阶1--1

简介: C++初阶1--1

介绍:

       本文开始从C到C++的过度,C++是C的进阶版,在C中,本身存在很多不足和不安全性,C++是进一步弥补了C的不足并提供了更高级的用法,不仅如此,大部分C++编译器还支持C语言的用法,但C语言不支持C++的用法,这样一来C++即包括了C语言的优点,还拥有了自己的独特优势,在后面的写入中笔者会将两者语言掺和起来,以方便学者们理解。在平常区分C语言和C++我们可直接根据两者的后缀名,C语言的基础文件都是以".c"为后缀,而C++的基础文件都以".cpp"为后缀。


一,命名空间

       在C/C++中,变量、函数和以后我们要学习的类都是大量存在的,但如果变量或函数名重复了又当会如何?C语言本身是无法解决此问题,一旦重复系统将报错,而C++将会使用命名空间解决此问题。在C++中专门有命名空间关键字namespace


#include <stdio.h>
int rand = 0;
int main() {
    //系统将会报错,因为在C语言库文件中就已定义了rand函数,不可再次进行定义
    fprintf(stdout, "rand: %d", rand);
    return 0;
}


1-1,命名空间的定义

       定义:namespace 命名空间的名字,然后下面接一堆{}即可,{}中即为空间中的成员。


       解析:命名空间相当于定义了一个新的作用域,该空间中的所有内容都局限于该空间中,不被外面影响,因此,它完美的解决了名称相同的问题。当要使用此空间中的成员时,需要用到域的作用限定符,即"::"。使用方法:命名空间名字::成员。要注意的是,使用结构体成员时:struct 命名空间的名字::结构体名称,并且,命名空间还可以嵌套使用。


#include <stdio.h>
//str是命名空间的名字
namespace str {
    //命名空间里可以是任意类型
    int rand = 0;
    int Add(int a, int b) {
        return a + b;
    }
    struct student {
        int age;
        int height;
    };
    //命名空间的嵌套使用
    namespace bitee {
        int a = 6;
    }
}
int main() {
    //整型类型的运用,其它类型同理
    fprintf(stdout, "rand = %d\n", str::rand);
    //结构体类型的运用
    struct str::student a1;
    a1.age = 2;
    fprintf(stdout, "结构体的运用: %d\n", a1.age);
    //函数的运用
    fprintf(stdout, "Add(1, 2) = %d\n", str::Add(1, 2));
    //命名空间的嵌套使用
    fprintf(stdout, "嵌套使用: %d\n", str::bitee::a);
    return 0;
}


       注意:在这里要说明的是C++允许同一个工程中存在多个相同名称的命名空间,编译器最后会合成同一个命名空间中,但同一个文件下不允许存在相同名称的命名空间,因为这样运用的话当两者同时定义相同的变量名时编译器将"不知所措"。例如:一个工程中的test.h和test.cpp文件中都有namespace std,运行时两个的std会被合成一个。


1-2,命名空间的使用

       命名空间的使用有三种方法,其中,以上运用域的限定符"::"只是其中最普通的一种。接下来我们观察以下两种。


       1,使用using将命名空间中某个成员引入


#include <stdio.h>
//str是命名空间的名字
namespace str {
    //命名空间里可以是任意类型
    int rand = 0;
    int Add(int a, int b) {
        return a + b;
    }
    struct student {
        int age;
        int height;
    };
    namespace bitee {
        int a = 6;
    }
}
//使用using后系统直接默认使用,这时不用域的限定符即可表示使用里面的数据
using str::rand;
using str::bitee::a;
int main() {
    fprintf(stdout, "%d %d\n", rand, a);
    return 0;
}

       2,使用using namespace 命名空间名称 将其全部引入

//将命名空间全部导入系统,这时会默认使用str
using namespace str;
int main() {
    fprintf(stdout, "%d %d\n", rand, bitee::a);
    return 0;
}


1-3,C++标准官方命名空间

       之前就说过,C++是C的进阶,C++高级功能的其中之一就体现在C++有自己的官方命名空间std,C++将标准库的定义实现都放到这个命名空间中,而std的使用通常与C++的里标准库文件密不可分,两者一般是配合使用。


C++常用标准函数:


       1. 使用cout标准输出对象(控制台)和cin标准输入对象(键盘)时,必须包含< iostream >头文件 以及按命名空间使用方法使用std。


       2. cout和cin是全局的流对象,endl是特殊的C++符号,表示换行输出,他们都包含在包含< iostream >头文件中。


       3. <<是流插入运算符,>>是流提取运算符。


       4. 使用C++输入输出更方便,不需要像C中printf/scanf输入输出时那样,需要手动控制格式。 C++的标准输入输出可以自动识别变量类型。


注意:关于cout和cin还有很多更复杂的用法,比如控制浮点数输出精度,控制整形输出进制格式等等。因为C++兼容C语言的用法,这些又用得不是很多,我们这里就不展开学习了。后续如果有需要,笔者会详细跟大家介绍。


//引用头文件
#include <iostream>
//标准命名空间的定义
using namespace std;
int main() {
    int a = 5;
    float b = 3.5;
    char str[] = "abcdf";
    cout << "a = " << a << endl << "b = " << b << endl << "str = " << str << endl;
    return 0;
}


二,缺省参数

       缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时,如果没有指定实参则采用该形参的缺省值,否则使用指定的实参。


#include <iostream>
using namespace std;
void Fun(int a = 5) {
    cout << "a = " << a << endl;
}
int main() {
    Fun(); //a = 5,采用该函数的缺省值5
    Fun(10);//a = 10,有了实参就用该实参的值10
    return 0;
}

2.1,缺省参数分类

1,全缺省参数


       全缺省参数是函数参数中全部指定缺省值,如下:


void Func(int a = 10, int b = 20, int c = 30) {
    cout << a << endl;
    cout << b << endl;
    cout << c << endl;
}

2,半缺省参数


       半缺省参数是函数参数中部分指定缺省值,但这里有两条注意事项:1,半缺省参数必须从右往左依次来给出,不能间隔着给。2. 缺省参数不能在函数声明和定义中同时出现如下:


//参数从右到左必须依次给出
void Func(int a, int b = 20, int c = 30) {
    cout << a << endl;
    cout << b << endl;
    cout << c << endl;
}
//错误运用
void Func(int a = 10, int b, int c = 30) {
    cout << a << endl;
    cout << b << endl;
    cout << c << endl;
}
//缺省参数的使用注意
#include <iostream>
using namespace std;
//函数定义和声明中不能同时给缺省值,因为编译器无法确定用哪个缺省值
//缺省值最好在声明中指定,因为我们运用函数一般都是先声明完之后在定义,如果系统先查看声明,里面没有缺省参数而定义中存在缺省参数将会报错
void fund(int a = 5) {
    cout << a << endl;
}
int main() {
    void fund(int a);
    fund();//将会报错,因为运行到函数声明时里面没有缺省参数而定义中指定缺省参数
    return 0;
}


       当出现缺省参数时,函数传参也必须要从右到左依次给出,如下:


#include <iostream>
using namespace std;
void Func(int a = 10, int b = 20, int c = 30) {
    cout << a << endl;
    cout << b << endl;
    cout << c << endl;
}
int main() {
    Func();//a = 10,b = 20,c = 30
    Func(2);//a = 2,b = 20,c = 30
    Func(1, 2);//a = 1,b = 2, c = 30
    Func(1, 2, 3);//a = 1,b = 2, c = 3
    Func(, 3, );//错误用法
    return 0;
}


C++初阶1--2https://developer.aliyun.com/article/1424505?spm=a2c6h.13148508.setting.24.214f4f0e2QJGOK

相关文章
|
4月前
|
存储 编译器 C++
【C++ 初阶路】--- 类和对象(下)
【C++ 初阶路】--- 类和对象(下)
22 1
|
4月前
|
存储 编译器 C语言
【C++初阶路】--- 类和对象(中)
【C++初阶路】--- 类和对象(中)
26 1
|
4月前
|
安全 编译器 程序员
【C++初阶】--- C++入门(上)
【C++初阶】--- C++入门(上)
29 1
|
4月前
|
存储 编译器 C++
【C++初阶】—— 类和对象 (中)
【C++初阶】—— 类和对象 (中)
34 3
|
4月前
|
编译器 C++
【C++初阶】—— 类和对象 (下)
【C++初阶】—— 类和对象 (下)
24 2
|
4月前
|
C语言 C++
【C++初阶】—— C++内存管理
【C++初阶】—— C++内存管理
28 1
|
4月前
|
存储 编译器 C语言
【C++初阶】—— 类和对象 (上)
【C++初阶】—— 类和对象 (上)
33 1
|
4月前
|
C语言 C++ 容器
【C++初阶学习】第十二弹——stack和queue的介绍和使用
【C++初阶学习】第十二弹——stack和queue的介绍和使用
41 8
|
4月前
|
存储 C++
C++初阶学习第九弹——探索STL奥秘(四)——vector的深层挖掘和模拟实现
C++初阶学习第九弹——探索STL奥秘(四)——vector的深层挖掘和模拟实现
42 8
|
4月前
|
存储 C++
C++初阶学习第十一弹——探索STL奥秘(六)——深度刨析list的用法和核心点
C++初阶学习第十一弹——探索STL奥秘(六)——深度刨析list的用法和核心点
48 7