c++关键字,命名空间,缺省参数,函数重载,引用,内联函数auto等学习(上)

简介: c++关键字,命名空间,缺省参数,函数重载,引用,内联函数auto等学习(上)

前言



C++是在C的基础之上,容纳进去了面向对象编程思想,并增加了许多有用的库,以及编程范式


等。熟悉C语言之后,对C++学习有一定的帮助。

c++补充了C语言语法的不足,以及C++是如何对C语言设计不合理的地方进行优化的。


一、c++关键字



c++一共有63个关键字,C语言32个关键字,也就是说c++在C语言的基础上多了一倍的关键字


asm do if return try continue
auto double inline short typedef for
bool dynamic_cast int signed typeid public
break else long sizeof typename throw
case enum mutable static union wchar_t
catch explicit namespace static_cast unsigned default
char export new struct using friend
class extern operator switch virtual register
const false private template void true
const_cast float protected this volatile while
delete goto reinterpret_cast      


二、命名空间



命名空间是为了防止自己的命名与c/c++库中的名称相同而不能使用,有了命名空间后,以前不能在c语言中使用的名称可以在命名空间中使用,要访问只需要在前面加上域作用限定符即可。当然,关键字是不能使用的即使在命名空间也不行


be7ba2845b054dcf86f2cca0a0c8929f.png


rand以前是随机数的函数,现在被我们定义成了int变量,所以报错人的重定义。想要解决这样的问题就需要命名空间。


63e0dd8eb1064a69a9854cd3a60c3b9d.pngdd5edefc5d854b3d8a6a1f3b15356710.png


从图中我们可以发现,除了关键字不能使用像库中的函数名等都可以在命名空间使用。


当然命名空间也支持嵌套:


ad2b6985350443ee89d417ea9d5b289c.png

69a1049ff4b24c0bb7c4e583f2c8335f.png


如上图所示, 对于要访问命名空间中的命名空间只需要加入合适的域名限定符即可。


在同一个工程中允许存在多个相同名称的命名空间,编译器最后会把他们合成到一个命名空间中。


一个命名空间就定义了一个新的作用域,命名空间中的所有内容都局限于该命名空间中。


当然命名空间不仅仅有上图中一种使用方式,下面是三种方法的对比:


加命名空间名称及作用域限定符。

5945fcf1435c42918f4c930265cee3e2.png


这就是我们使用的那个方法。


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


45d9b8e71ee74dc980495416b758eb30.png


使用using namespace命名空间名称引用

e9fc6dc120da409fa07b79a7eea571c5.png


三:c++输入和输出



std是c++标准库的命名空间名,c++将标准库的定义实现都放在这个命名空间中。


168d691f2788423ca52cf46acdd2b77e.png

45413da2c0db45ccaf26314b6b64c331.png

 

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


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


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


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


四:缺省参数



缺省参数就是声明或定义函数时为函数的参数指定一个缺省值,如果你在调用这个函数的时候没有传参数,那么这个函数的参数的值就是缺省值,如果你在调用这个函数的时候传了参数,那么这个函数的参数的值就是你所传参数的值。

1ed36390ef444aed9853637a5705a8c2.png


缺省又分为全缺省和半缺省,全缺省的意思就是函数的每个参数都给了缺省值,半缺省的意思就是函数的参数只给了个别的缺省值。

6528d3827e7a42a3a79fe0bedc686044.png9bde74cfa9ca4f4997d802bba6b0e023.png


1.半缺省参数必须从右往左依次来给出不能间隔着给,比如上图49行代码应该从z开始依次向左给出。


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


3.缺省值必须是常量或者全局变量。


五:函数重载



函数重载是函数的一种特殊情况,c++允许在同一个作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数,类型,类型顺序)不同,常用来处理实现功能类似数据类型不同的问题。


第一种: 参数类型不同


void test(int x, int y)
{
  cout << "test(int x,int y)" << endl;
}
void test(double x, double y)
{
  cout << "test(double x,double y)" << endl;
}
int main()
{
  int a = 10, b = 20;
  double x = 1.22, y = 3.22;
  test(a, b);
  test(x, y);
  return 0;
}

c45123be818c487ab3c7498490bb1d27.png


第二种:参数个数不同

void test(int x)
{
  cout << "test(int x)" << endl;
}
void test()
{
  cout << "test()" << endl;
}
int main()
{
  int a = 10;
  test(a);
  test();
  return 0;
}

cdc31cad9eaf401b853f9e06f09d24a7.png


第三种:参数类型顺序不同


void test(int x, char y)
{
  cout << "test(int x,char y)" << endl;
}
void test(char y, int x)
{
  cout << "test(char y,int x)" << endl;
}
int main()
{
  int a = 10;
  char c = 'a';
  test(a,c);
  test(c,a);
  return 0;
}

21ff86426c0b4204bbcf64355319ebbc.png


以上就是函数重载的演示,不知道大家有没有想过为什么函数返回值不能做函数重载呢?


因为如果返回值可以重载的话那么你在调用函数传参的时候该怎么区分呢?如下图

d29338368d154820b737cdcf3060ab1e.png

两个函数都传一个int类型的参数编译器根本无法区分到底调用哪个。


由于windows下函数重载命名的方式太过复杂,我们在linux环境下看g++编译完成后函数名字的修饰是如何改变的。


f78358e1226c4e6e8d3b8fb812afe35a.png

9b021f8bd4ce4b1081f32647ae3f67d5.png


我们可以发现testii和testdd就是test的两个函数,编译器通过函数参数不同去命名不同的函数。


目录
相关文章
|
10月前
|
存储 编译器 程序员
c++的类(附含explicit关键字,友元,内部类)
本文介绍了C++中类的核心概念与用法,涵盖封装、继承、多态三大特性。重点讲解了类的定义(`class`与`struct`)、访问限定符(`private`、`public`、`protected`)、类的作用域及成员函数的声明与定义分离。同时深入探讨了类的大小计算、`this`指针、默认成员函数(构造函数、析构函数、拷贝构造、赋值重载)以及运算符重载等内容。 文章还详细分析了`explicit`关键字的作用、静态成员(变量与函数)、友元(友元函数与友元类)的概念及其使用场景,并简要介绍了内部类的特性。
396 0
|
安全 编译器 程序员
C++ noexcept 关键字的关键作用
`noexcept` 关键字在 C++ 中扮演着重要角色,通过正确使用 `noexcept`,可以提升程序的性能、增强代码的可读性和安全性,并且有助于编译器进行优化。在编写 C++ 代码时,应仔细考虑每个函数是否应该声明为 `noexcept`,以充分利用这一特性带来的优势。通过本文的介绍,希望开发者能够更好地理解和应用 `noexcept` 关键字,从而编写出更加高效、健壮的 C++ 程序。
460 8
|
安全 编译器 C++
C++ `noexcept` 关键字的深入解析
`noexcept` 关键字在 C++ 中用于指示函数不会抛出异常,有助于编译器优化和提高程序的可靠性。它可以减少代码大小、提高执行效率,并增强程序的稳定性和可预测性。`noexcept` 还可以影响函数重载和模板特化的决策。使用时需谨慎,确保函数确实不会抛出异常,否则可能导致程序崩溃。通过合理使用 `noexcept`,开发者可以编写出更高效、更可靠的 C++ 代码。
|
存储 安全 编译器
【C++】C++特性揭秘:引用与内联函数 | auto关键字与for循环 | 指针空值(一)
【C++】C++特性揭秘:引用与内联函数 | auto关键字与for循环 | 指针空值
279 1
|
存储 编译器 程序员
【C++】C++特性揭秘:引用与内联函数 | auto关键字与for循环 | 指针空值(二)
【C++】C++特性揭秘:引用与内联函数 | auto关键字与for循环 | 指针空值
201 0
|
编译器 C++ 开发者
【C++篇】深度解析类与对象(下)
在上一篇博客中,我们学习了C++的基础类与对象概念,包括类的定义、对象的使用和构造函数的作用。在这一篇,我们将深入探讨C++类的一些重要特性,如构造函数的高级用法、类型转换、static成员、友元、内部类、匿名对象,以及对象拷贝优化等。这些内容可以帮助你更好地理解和应用面向对象编程的核心理念,提升代码的健壮性、灵活性和可维护性。
|
12月前
|
编译器 C++ 容器
【c++11】c++11新特性(上)(列表初始化、右值引用和移动语义、类的新默认成员函数、lambda表达式)
C++11为C++带来了革命性变化,引入了列表初始化、右值引用、移动语义、类的新默认成员函数和lambda表达式等特性。列表初始化统一了对象初始化方式,initializer_list简化了容器多元素初始化;右值引用和移动语义优化了资源管理,减少拷贝开销;类新增移动构造和移动赋值函数提升性能;lambda表达式提供匿名函数对象,增强代码简洁性和灵活性。这些特性共同推动了现代C++编程的发展,提升了开发效率与程序性能。
467 12
|
10月前
|
人工智能 机器人 编译器
c++模板初阶----函数模板与类模板
class 类模板名private://类内成员声明class Apublic:A(T val):a(val){}private:T a;return 0;运行结果:注意:类模板中的成员函数若是放在类外定义时,需要加模板参数列表。return 0;
251 0
|
编译器 C语言 C++
类和对象的简述(c++篇)
类和对象的简述(c++篇)
|
设计模式 安全 C++
【C++进阶】特殊类设计 && 单例模式
通过对特殊类设计和单例模式的深入探讨,我们可以更好地设计和实现复杂的C++程序。特殊类设计提高了代码的安全性和可维护性,而单例模式则确保类的唯一实例性和全局访问性。理解并掌握这些高级设计技巧,对于提升C++编程水平至关重要。
233 16