C到C++的敲门砖-1

2024-03-17 05:44
文章标签 c++ 敲门砖

本文主要是介绍C到C++的敲门砖-1,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 关键字
  • 命名空间
  • 输入和输出
  • 缺省参数
  • 函数重载

关键字

相较于C语言32个关键字:

autodoubleintstruct
breakelselongswitch
caseenumregistertypedef
charexternreturnunion
constfloatshortunsigned
continueforsignedvoid
defaultgotosizeofvolatile
doifwhilestatic

c++的关键字变成了63个:

asmdoifreturn
trycontinueautodouble
shorttypedeffordynamic_cast
intsignedtypeidpublic
breakelselongsizeof
typenamethrowcaseenum
mutablestaticunionwchar_t
catchexplicitnamespacestatic_cast
unsigneddefaultcharexport
newstructusingfriend
classexternoperatorswitch
virtualregisterconstfalse
privatetemplatevoidtrue
const_castfloatprotectedthis
volatilewhiledeletegoto
reinterpret_castinlinebool

显然多一个关键字,多一种可能性。>.<

命名空间

在C语言中,在同一作用域中,同名是不允许的。这就会引发一些问题,例如包含库函数的时候,和定义的全局变量或者函数名冲突。

#include<stdlib.h>
#include<stdio.h>
int rand = 10;
int main()
{printf("%d\n", rand);return 0;
}

在这里插入图片描述
如上所见,我们定义的全局变量和头文件stdlib.h里面的rand函数冲突了,导致程序无法运行。
这样冲突的现象在开发过程中是很容易遇到的,所以C语言这种统一规定所有变量不能重名的设定是不方便的。
由此,c++引入了命名空间的概念:
我们可以用关键字namespace来定义命名空间,

namespace test1{// 命名空间中可以定义变量/函数/类型int rand = 10;int Add(int left, int right){return left + right;}struct Node{struct Node* next;int val;};}
namespace test2{double rand = 10.;}

这样我们就能在不同命名空间里面取相同名字rand的变量而不引发报错。
当我们需要使用命名空间时,有以下几种方式:

1.using namespce ;

#include<iostream>
namespace test2{double rand = 10.;}
using namespace std;
using namespace test2;
int main()
{cout<<rand<<endl;return 0;
}

using namespace,相当于将命名空间置于全局变量中,里面的所有变量名都可以使用。其中std是c++标准库的命名空间,我们要使用cin、cout等函数时都要使用这个命名空间。
这种方式的缺陷也是很明显的,如果直接把命名空间都解放了,那和c语言又有什么区别呢?
因此还有以下使用方式:
2.使用作用域限定符"::"

#include<iostream>
namespace test2{double rand = 10.;}
using namespace test2;
int main()
{std::cout<<rand<<endl;return 0;
}

如上的cout,我们就没有using namespace std,而是用“命名空间::变量名”的形式来使用cout。
需要注意的是当::前为空的时候,默认作用域为全局域
这种方式能够有效避免了变量名冲突的问题,但同时如果我们这个程序里要多次使用cout这个函数,那每个cout前都要加上std::就显得相当麻烦。因此命名空间的使用还有第三种方式:
3.使用using将命名空间中某个成员引入

#include<iostream>
namespace test2{double rand = 10.;}
using namespace test2;
using std::cout;
int main()
{cout<<rand<<endl;return 0;
}

如上我们可以单独拿出std里面的cout函数来使用,这种方式就兼具了上述两种方式的优点,既不会冲突也不会那么麻烦。
当然具体使用哪种方式还是要视情况而定的。不可否认的是,命名空间这个语法的确改善了C语言一大不足之处。

输入和输出

细心的读者已经发现,上面我们使用的输入输出函数不是stdio.h下面的scanf和printf,而是iostream下面的cin和cout。
这也是C和C++不同的地方,特别是当我们使用printf打印数据时,需要使用占位符来格式化数据,而cout则会自动识别数据类型。
使用cout的<<符号称为流插入符,即将数据插入输出流然后输出到屏幕。
那么使用cin的>>符号称为流提取符,从键盘上读取数据到变量中。

缺省参数

在C语言中定义一个函数如:

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

调用Add函数时,就必须输入两个实参传输过去。
而c++中我们可以使用缺省参数:

int Add(int a=0,int b=0)
{return a+b;
}

这时当我们不传入实参时,a和b的值就默认为0.这就称为缺省参数。
当然我们可以传入a,b的值也可以只传入a的值,但不能只传入b的值
关于缺省参数分为以下几类:

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

即函数的参数全为缺省参数。

  • 半缺省参数
void Func(int a, int b = 10, int c = 20){cout<<"a = "<<a<<endl;cout<<"b = "<<b<<endl;cout<<"c = "<<c<<endl;}

即有一部分参数为缺省参数。
需要注意的是:

  1. 半缺省参数必须从右往左依次来给出,不能间隔着给
  2. 缺省参数不能在函数声明和定义中同时出现(在声明中给出缺少参数,而在定义中不能给缺省参数)
  3. 缺省值必须是常量或者全局变量(通常为常量

函数重载

在C语言中,函数重名是绝对不允许的,编译器会报错。而在c++中,允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数 或 类型 或 类型顺序)不同。
如:

int Add(int a,int b)
{return a+b;
}
double Add(double a,double b)
{return a+b;
}

如上函数定义在c++中是允许的。而在C语言中是不允许的。
这是因为在C语言中,同名函数在编译时给出指向函数的地址都是相同的,因此无法识别同名函数的不同类型。而在c++的编译过程中,会用函数名和参数类型来一定标识函数,由此就能区分开同名函数的不同类型。

这篇关于C到C++的敲门砖-1的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/817999

相关文章

C++使用printf语句实现进制转换的示例代码

《C++使用printf语句实现进制转换的示例代码》在C语言中,printf函数可以直接实现部分进制转换功能,通过格式说明符(formatspecifier)快速输出不同进制的数值,下面给大家分享C+... 目录一、printf 原生支持的进制转换1. 十进制、八进制、十六进制转换2. 显示进制前缀3. 指

C++中初始化二维数组的几种常见方法

《C++中初始化二维数组的几种常见方法》本文详细介绍了在C++中初始化二维数组的不同方式,包括静态初始化、循环、全部为零、部分初始化、std::array和std::vector,以及std::vec... 目录1. 静态初始化2. 使用循环初始化3. 全部初始化为零4. 部分初始化5. 使用 std::a

C++ vector的常见用法超详细讲解

《C++vector的常见用法超详细讲解》:本文主要介绍C++vector的常见用法,包括C++中vector容器的定义、初始化方法、访问元素、常用函数及其时间复杂度,通过代码介绍的非常详细,... 目录1、vector的定义2、vector常用初始化方法1、使编程用花括号直接赋值2、使用圆括号赋值3、ve

如何高效移除C++关联容器中的元素

《如何高效移除C++关联容器中的元素》关联容器和顺序容器有着很大不同,关联容器中的元素是按照关键字来保存和访问的,而顺序容器中的元素是按它们在容器中的位置来顺序保存和访问的,本文介绍了如何高效移除C+... 目录一、简介二、移除给定位置的元素三、移除与特定键值等价的元素四、移除满足特android定条件的元

Python获取C++中返回的char*字段的两种思路

《Python获取C++中返回的char*字段的两种思路》有时候需要获取C++函数中返回来的不定长的char*字符串,本文小编为大家找到了两种解决问题的思路,感兴趣的小伙伴可以跟随小编一起学习一下... 有时候需要获取C++函数中返回来的不定长的char*字符串,目前我找到两种解决问题的思路,具体实现如下:

C++ Sort函数使用场景分析

《C++Sort函数使用场景分析》sort函数是algorithm库下的一个函数,sort函数是不稳定的,即大小相同的元素在排序后相对顺序可能发生改变,如果某些场景需要保持相同元素间的相对顺序,可使... 目录C++ Sort函数详解一、sort函数调用的两种方式二、sort函数使用场景三、sort函数排序

Java调用C++动态库超详细步骤讲解(附源码)

《Java调用C++动态库超详细步骤讲解(附源码)》C语言因其高效和接近硬件的特性,时常会被用在性能要求较高或者需要直接操作硬件的场合,:本文主要介绍Java调用C++动态库的相关资料,文中通过代... 目录一、直接调用C++库第一步:动态库生成(vs2017+qt5.12.10)第二步:Java调用C++

C/C++错误信息处理的常见方法及函数

《C/C++错误信息处理的常见方法及函数》C/C++是两种广泛使用的编程语言,特别是在系统编程、嵌入式开发以及高性能计算领域,:本文主要介绍C/C++错误信息处理的常见方法及函数,文中通过代码介绍... 目录前言1. errno 和 perror()示例:2. strerror()示例:3. perror(

C++变换迭代器使用方法小结

《C++变换迭代器使用方法小结》本文主要介绍了C++变换迭代器使用方法小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1、源码2、代码解析代码解析:transform_iterator1. transform_iterat

详解C++中类的大小决定因数

《详解C++中类的大小决定因数》类的大小受多个因素影响,主要包括成员变量、对齐方式、继承关系、虚函数表等,下面就来介绍一下,具有一定的参考价值,感兴趣的可以了解一下... 目录1. 非静态数据成员示例:2. 数据对齐(Padding)示例:3. 虚函数(vtable 指针)示例:4. 继承普通继承虚继承5.