cpp基础(1)

文章介绍了C++中的命名空间用于解决命名冲突问题,提供了三种使用方式:直接使用全名,using声明和using命名空间。接着讨论了C++的输入输出机制,如cin和cout。然后讲解了缺省参数的功能和规则,以及函数重载的概念。最后提到了externC用于在C++中调用C语言函数时处理名称修饰问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

命名空间

定义

由于c语言中有许多的库自带的函数、变量等名称,因此无法c语言无法以他们继续命名,例如rand这个函数,rand=1便会产生问题。
因此,cpp增加了命名空间 (namespace) 这一概念,放个例子先:这就是基础的命名空间
如图所示,我可以利用命名空间N1来对里面的a和Add函数进行本地化,这样不会产生c语言的语言污染问题,所以里面的变量怎么定义都可以:scanf、rand…(注意:命名空间可以嵌套、同一个工程也可以存在多个命名空间、相同的命名空间最后会合成一个)

这里我做一个小类比:世界上有很多叫catjuicy的人,在大街上喊一声,便会有很多人来回应,那么怎么办才好呢,用一个小笼子把他关起来。当然,这个笼子里同时还可以装得下其他人,比如poohpooh、志师父等等,上面贴上标号,这样,想要指定特殊的catjuicy就很容易啦。至于怎么通过标号来叫他,请见下文。

使用方法

命名空间有三种用法:
1.加名称以及作用域限定符
举个例子先:printf(“d\n”, NAMESPACE1::catjuicy)
这句话的意思便是打印出在namespace1中的catjuicy,也就是笼子1中的catjuicy,::是作用域限定符,便是从命名空间取出来的意思,这便是通过标号来呼叫笼子1中的人,但是缺点是非常复杂,每次喊他们都需要从命名空间中拿出来都需要使用一次,因此第二种便呼之欲出了。

2.使用using将命名空间中的成员引出
举个例子:using NAMESPACE1::catjuicy
这段代码是放在代码开头,意味这笼子1中的catjuicy被解放了,它在这个全局里面再也不用通过标号来叫它了,可以直接使用,可是笼子1中的poohpooh他们还没有被解放,那么,有没有把整个笼子都打开的办法呢?第三种也就出现了。

3.使用using namespace命名空间引入
举个例子:using namespace NAMESPACE1
同样,这段代码放在代码开头,这意味这NAMESPACE1中的成员全部被解放了,笼子1中的catjuicy的好朋友们全部自由,可以随意呼唤他们了。因此,using namespace std这类常见的语言便可以理解了,std便是cpp的标准库,意味这里面的函数可以随意调用。

输入与输出

cpp引入的全新的输入和输出模式,即cin标准输入(键盘)、cout标准输出(控制台)、>>(流提取运算符)、<<(流插入运算符) 与 头文件以及std标准命名空间相配合 的方法,举个例子先:

#include<iostream>
using namespace std;
int main(){
    int a;
    double b;
    cin>>a>>b;
    cout<<a<<" "<<b<<endl;
    return 0;
}

如图所示,cin>>a>>b表示键盘输入两个值,一个是int,一个为double,中间用空格分开,与scanf相似,但是更方便,“流提取”这个词在此刻非常符合该场景,意味着从cin标准输入(键盘)提取值赋予给a和b。
cout<<a<<" "<<b<<endl 表示类似意思,a和b与endl被插入到cout标准输出(控制台),endl表示换行,“ ”表示输出时a与b的值输出结果中间有一个空格。

缺省参数

c中一个函数中的参数是没有初始值的,需要进入后才会赋予,cpp更改了这一问题,在声明或定义函数时便可以对指定的参数进行指定默认值,听不懂?举个例子先:

void juicyfunc(int m, int z=6, int d=4)
{
     cout<<m<<endl;
     cout<<z<<endl;
     cout<<d<<endl;
}

短短四行代码便将最复杂的情况阐述了出来,因为本文一贯遵循“惩前毖后,治病救人”的指导方针来为大家做科普。
首先,有两个注意点:
1. 半缺省参数(也就是本代码)必须从右往左依次给出,不得间隔
2. 缺省参数不得在函数定义与声明中同时出现

1的解释:很好理解,必须从右,因为从左开始的话最后一个万一没有默认值,就必须把前面的全部打出来,而不可以juicyfunc(,,4),这是不被允许的,只允许juicyfunc(4),也就是m被赋予了4,其他值依旧是默认值。
2的解释:如果没有函数声明,那么只需要在函数定义中写就可以。但是,如果有函数声明,那么同时写就会出问题,因为群众中可能会有坏人,在声明与定义中使用不一样的默认值,这会出大乱子。因此,定义与声明中缺省参数不得同时出现,如果是在做工程的话,分为.h 和 .cpp文件的话,h文件放声明,cpp放定义,当且仅当缺省参数只能写在函数声明中,因为程序的编译阶段分为四部分:预编译,编译,汇编,链接。编译期间会将h文件展开,但是如果h中没有缺省参数的话,就会报错,因为只有在链接时才会去找函数的地址。

当然,有人要问了,可不可以全缺省呢,当然可以了,那样更加方便,使用函数时就可以参数什么都不填了,美哉。

函数重载

在c中,我们想写一个add函数的话,由于参数的不同,我们需要写很多种add函数,而且名字不可以相同,例如addint,adddouble,addfloat等等,这看起来非常麻烦,cpp也采用全新形式:函数重载,老样子,举个例子先:

int add(int l, int b)
{
    return l+b;
}
int add(double l, double b)
{
    return l+b;
}

相信有慧根的一眼便看出了真相,没错,正是这样,函数重载可以使函数名称在不改变的前提下,对参数进行变化。因此,函数参数的类型,顺序,个数必须不同才可以,当然,有两个小误区大家务必注意:
int add(int l, int b)int add(int b, int l)本质可是一样的,这可不是函数重载,这就是同一个函数;
另一个问题是int add(short l, short b)short add(short l, short b)也不是重载函数,因为调用的话,很显然,自己都不知道调的是哪个函数,更何况是电脑。
当然,更本质的问题是为什么cpp可以支持函数重载呢?它是怎么做到的呢?
哎呀,那我就好心继续讲解一下吧 ,情况是这样的,在对编译的每个流程的严格查看后,我们发现,原来cpp将函数修饰成了全新的名字,即 (_Z+函数长度+函数名称+参数的首字母) ,而c中则是对名称保持不变,实在是败笔。

extern “C”

最后,简单介绍一下这个东西,在cpp中有的时候需要引用c中的文件,这时候就出现了不兼容的问题,可是,cpp可是c的避开错误版,怎么可能会想不到呢,答案就是它会使用extern “C” 来修饰函数,用法便是在函数名称前加上,这样编译器就会知道这个函数需要按照c的规则来编译,这样就完美解决问题了.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值