C++入门之开胃小菜

关键词:命名空间,cout(标准输出),cin(标准输入),缺省参数。

本文章对cout,cin,缺省参数浅尝辄止。

目录

命名空间

简单了解C++头文件

cin&cout 标准输入输出

缺省参数 


命名空间

在软件开发的过程中,我们往往会给变量取一些有意义的名字,以方便开发以及后续的维护。

但当一个软件的体量足够大的时候,就很有可能会出现变量或函数命名的冲突。当程序的体量大到一定程度的时候,抛开有些猛人可以一个人扛起整个程序的所有,大家都是普普通通的平凡人,往往都是通过多人协作,一人负责一个模块来完成的。在这种开始各自为政,最后合而为一的情况下,很有可能每个人各自的代码都通过了编译,但结合到一起的时候就出现各种各样的命名冲突。总不能每个人的变量及函数命名都写成“小组_姓名_变量名”的形式吧?于是,命名空间应运而出。

namespace name{
    //variables, functions, classes
}

//name即命名空间的名字。

在C/C++中,变量、函数和类都是大量存在的,这些变量、函数和类的名称将都存在于全局作用域中,可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染。namespace关键字的出现就是针对这种问题的。 

命名空间有时也被称为名字空间、名称空间。

命名空间中可以包括变量、函数、类、typedef、#define 等。

在命名空间外使用明明空间内的变量时,通常有三种方法

1.使用域解析操作符        ::

namespace test {
    int t1;
    int t2;
    long fun() {
        return 0;
    }
}

int main() {
    test::t1 = 1;
    test::t2 = 2;
    test::fun();
    return 0;
}

 如果命名空间中的某个变量需要使用的次数比较多,这种方法反倒会导致很多无谓的工作量。

 2.使用using关键字声明命名空间中某个变量(或函数等)

namespace test {
    int t1;
    int t2;
    long fun() {
        return 0;
    }
}

using test::t1;
using test::fun;

int main() {
    t1 = 1;
    test::t2 = 2;
    fun();
    return 0;
}

这是在使用C++库提供的命名空间时,最推荐使用的。 

3.使用using关键字声明整个命名空间 

namespace test {
    int t1;
    int t2;
    long fun() {
        return 0;
    }
}

using namespace test;

int main() {
    t1 = 1;
    t2 = 2;
    fun();
    return 0;
}

 在使用C++库提供的命名空间时,其实并不是很提倡这种方法,因为C++库提供的命名空间中所定义的变量及函数等实在太过庞杂,如果直接将库提供的整个命名空间声明过来,很难保证不会出现命名冲突等问题。

简单了解C++头文件

简单了解过C++的朋友肯定都知道,C++最初版本的名字叫做C With Class,它是在C语言的基础上拓展而成的。而已经使用C++进行过一些简单编程的朋友肯定也注意到了,C++自己的头文件在命名上是没有 .h 后缀的。

实际上一开始C++自身的头文件也是有 .h 后缀的,但那时非常古远的时候了,那时候C++还没有引入命名空间这个概念的。一切都在命名空间到来的那一刻改变了。

由于命名空间的引入,开发C++的大佬们决定重新编写C++库,将类,函数,宏等整合到一个命名空间中,这个命名空间就是我们在C++编程中会普遍用到的 std ,即standard,标准命名空间。

革新往往伴随着矛盾与冲突,毕竟当时C++又不是什么初出茅庐的新语言了,有不少的项目都已经用老版的C++开发出来了,C++一旦如此革新,岂不是意味着曾经的那些代码还需要再修改一遍?

开发C++的大佬们有了一个好主意,保留原来的库和头文件,它们在 C++ 中可以继续使用,然后再把原来的库复制一份,在此基础上稍加修改,把类、函数、宏等纳入命名空间 std 下,就成了新版 C++ 标准库。这样共存在了两份功能相似的库。为了避免头文件的重名,新版的C++库取消了后缀 .h 。

既然要改,只修改整合C++的库多没有意思,大佬们对C语言的头文件也下手了,同时为了表明这个头文件的原版是来自于C语言的,大佬们再C头文件的前边还贴心地加上了一个 c ,使它们变成了cstdio、cstdlib ...

cin&cout 标准输入输出

在C语言中,我们通常使用 printf 与 scanf 进行输出输入操作。但 printf 与 scanf 的输出与输入还需要通过%d %s %c %f等指定变量的类型,一不小心就会出错,着实麻烦。

对此C++提供了一套新的输入输出库。

cin        标准输入

cout        标准输出

与之配套使用的还有

<<        流插入运算符

>>        流提取运算符

endl        end of line结束一行,可以刷新缓冲区

cout 与 cin 会自行处理输入的数据信息,判断数据类型。 

#include <iostream>

using std::cin;
using std::cout;
using std::endl;

int main() {
    int i = 1;
    float f = 3.5;
    char s[] = "i think you can see it";

    cin >> i;
    cout << i << s << f << endl;
    return 0;
}

 

使用cout输出进制转换

C++库给我们提供了一系列的转换进制输出的方法

#include <iostream>

std::dec        十进制

std::hex        十六进制

std::oct        八进制 

#include <iomanip>

setbase(n)        n只能取8、10、16对应八进制、十进制、十六进制。

#include <iostream>
#include <iomanip>

using std::cin;
using std::cout;
using std::endl;
using std::setbase;
int main() {
    cout << std::dec << 100 << endl;
    cout << std::hex << 100 << endl;
    cout << std::oct << 100 << endl;
    cout << setbase(10) << 100 << endl;
    cout << setbase(16) << 100 << endl;
    cout << setbase(8) << 100 << endl;
    return 0;
}

需要注意的是,cin 与 cout 都是C++的内置对象,而不是关键字。

使用 cin 的时候需要紧跟着 >> 运算符;

使用 cout 的时候需要紧跟着 << 运算符。

同时,我们可以在 cout 或者 cerr 操作结束的时候搭配使用 endl ,其作用与 '\n' 类似。

缺省参数 

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

#include <iostream>

using std::cout;
using std::endl;

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

int main() {
    cout << endl;
    cout << add() << endl;
    return 0;
}

运行结果:

 可见,我们在函数 add 调用时并没有传入任何参数,编译器直接按照我们设置的默认参数执行了函数体。

#include <iostream>

using std::cin;
using std::cout;
using std::endl;

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

int main() {
    cout << endl;
    cout << add(6) << endl;
    return 0;
}

运行结果:

 当我们只输入一个参数时,编译器默认将我们输入的参数覆盖了第一个参数的默认值。

#include <iostream>

using std::cin;
using std::cout;
using std::endl;

int add(int a = 3, int b = 2);

int main() {
    cout << endl;
    cout << add(6) << endl;
    return 0;
}

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

 运行结果:

#include <iostream>

using std::cin;
using std::cout;
using std::endl;

int add(int a, int b);

int main() {
    cout << endl;
    cout << add() << endl;
    return 0;
}

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

 编译报错:

int add(int a = 2, int b = 3);

int add(int a = 2, int b = 3) {
    return a + b;
}
int main() {
    add();
    return 0;
}

编译报错:  

我们可以在声明或实现处传入缺省参数,但声明与实现处的缺省参数却不能同时给出,否则会发生参数重定义报错,同时,如果函数的实现在main函数之后,也会发生报错。所以,在一般情况下,我们建议缺省参数只在声明处给出即可

以上缺省参数方法给函数所有的参数都设置了默认值,这种缺省参数方法称之为全缺省

我们也可以只给个别参数设置默认值,这种方法称之为半缺省

半缺省方法的参数必须从右至左依次给出

int add(int a, int b = 2, int c = 3) {
    return a + b + c;
}

//cout << add(1) << endl;

运行结果:

int add(int a = 2, int b, int c = 3) {
    return a + b + c;
}

//cout << add(1) << endl;

编译报错: 

int add(int a = 2, int b = 3, int c) {
    return a + b + c;
}

//cout << add(1) << endl;

编译报错:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

云雷屯176

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值