IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> c + + 入门 (上篇) -> 正文阅读

[C++知识库]c + + 入门 (上篇)

目录

前言

?一.命名空间

1.命名空间的定义

2.命名空间的使用

二.C++输入&输出

三.缺省参数

1.缺省参数的概念

2.缺省参数的分类

四.函数重载

1.函数重载概念

2. C++支持函数重载的原理--名字修饰

2.C++支持函数重载的好处

3.函数重载的一些注意事项


前言

? ? ? ? C++是在C的基础之上,补充了C语言语法的不足,容纳进去了面向对象编程思想,并增加了许多有用的库,以及编程范式等,下面我们一起来看看吧。

?一.命名空间

? ? ? ? 首先我们要知道为什么会有命名空间这个概念呢?在C/C++中,变量、函数和类都是大量存在的,这些变量、函数和类的名称将都存在于全局作用域中,可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化, 以避免命名冲突或名字污染,因为在C语言中没办法解决类似这样的命名冲突问题,所以在C++中提出了 namespace? 来解决。

1.命名空间的定义

????????定义命名空间,需要使用到? namespace? 这个关键字,后面跟上命名空间的名字,然后接一对{}即可,{} 中即为命名空间的成员,这些成员都是属于全局的。

? ? ? ? 命名空间中可以定义变量,函数和类型,还可以嵌套使用。如果同一个工程中允许存在多个相同名称的命名空间,那么编译器最后会合成到同一个命名空间中。

// 命名空间中可以定义变量/函数/类型
namespace N
{
     
     int rand = 10;
     int Add(int left, int right)
     {
         return left + right;
     }
     struct Node
     {
         struct Node* next;
         int val;
     };
}
//还可以嵌套使用
namespace N1
{
    int a;
    int b;
    int Add(int left, int right)
    {
         return left + right;
    }
    namespace N2
    {
         int c;
         int d;
         int Sub(int left, int right)
         {
             return left - right;
         }
    }
}

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

2.命名空间的使用

? ? ? ? 那么命名空间中的成员该如何使用呢?

? ? ? ? 在这里可以把 namespace 比喻成一堵围墙,被他封装的内容就被这堵围墙牢牢挡住,外面人是看不到的。只有通过特定的方式才可以使用到 namespace 里面的内容。

????????命名空间的使用有三种方式:? ? ?

//一是加命名空间名称及作用域限定符
int main()
{
    printf("%d\n", N1::a);
    return 0;    
}
// 二是使用using将命名空间中某个成员引入
using N1::b;
int main()
{
    printf("%d\n", N1::a);
    printf("%d\n", b);
    return 0;    
}
//三是使用using namespace 命名空间名称 引入(这里就是把N1这个命名空间给展开了)
using namespce N1;
int main()
{
    printf("%d\n", N1::a);
    printf("%d\n", b);
    Add(10, 20);
    return 0;    
}

第三种方式使用起来比较方便,但可能会有点弊端,那么弊端是什么呢?这种就相当于是把墙给拆了,把设定的内容给暴露出来了,可能会引起命名冲突。


二.C++输入&输出

? ? ? ? 每一个新事物诞生都会用自己独特的方式向这个世界打招呼,C++也不例外,我们来看下C++是如何来实现问候的。

#include<iostream>
// std是C++标准库的命名空间名,C++将标准库的定义实现都放到这个命名空间中
using namespace std;
int main()
{
cout<<"Hello world!!!"<<endl;
return 0;
}
#include <iostream>
using namespace std;
int main()
{
   int a;
   double b;
   char c;
     
   // 可以自动识别变量的类型
   cin>>a;
   cin>>b>>c;
     
   cout<<a<<endl;
   cout<<b<<" "<<c<<endl;
   return 0;
}

说明:

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

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

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

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

三.缺省参数

1.缺省参数的概念

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

void Func(int a = 0)
{
 cout<<a<<endl;
}
int main()
{
 Func();     // 没有传参时,使用参数的默认值
 Func(10);   // 传参时,使用指定的实参
return 0;
}

2.缺省参数的分类

  • 全缺省参数
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. 缺省参数不能在函数声明和定义中同时出现(一般都是在声明里出现缺省参数,定义里出现会报错)

 //a.h
  void Func(int a = 10);
  
  // a.cpp
  void Func(int a = 20)
 {}

  // 注意:如果生命与定义位置同时出现,恰巧两个位置提供的值不同,那编译器就无法确定到底该
用那个缺省值。

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

4. C语言不支持(编译器不支持)


四.函数重载

????????自然语言中,一个词可以有多重含义,人们可以通过上下文来判断该词真实的含义,即该词被重载了。

1.函数重载概念

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

#include<iostream>
using namespace std;
// 1、参数类型不同
int Add(int left, int right)
{
 cout << "int Add(int left, int right)" << endl;
 return left + right;
}
double Add(double left, double right)
{
 cout << "double Add(double left, double right)" << endl;
 return left + right;
}
// 2、参数个数不同
void f()
{
 cout << "f()" << endl;
}
void f(int a)
{
 cout << "f(int a)" << endl;
}
// 3、参数类型顺序不同
void f(int a, char b)
{
 cout << "f(int a,char b)" << endl;
}
void f(char b, int a)
{
 cout << "f(char b, int a)" << endl;
}
int main()
{
 Add(10, 20);
 Add(10.1, 20.2);
 f();
 f(10);
 f(10, 'a');
 f('a', 10);
 return 0;
}

2. C++支持函数重载的原理--名字修饰

????????为什么C++支持函数重载,而C语言不支持函数重载呢?

???????? 在C/C++中,一个程序要运行起来,需要经历以下几个阶段:预处理、编译、汇编、链接。实际项目通常是由多个头文件和多个源文件构成,我们可以知道,【当a.cpp中调用了b.cpp中定义的Add函数时】,编译后链接前,a.o的目标文件中没有Add的函数地址,因为Add是在b.cpp中定义的,所以Add的地址在b.o中。那么怎么办呢? ?

????????所以链接阶段就是专门处理这种问题,链接器看到a.o调用Add,但是没有Add的地址,就会到b.o的符号表中找Add的地址,然后链接到一起。那么链接时,面对Add函数,链接接器会使用哪个名字去找呢?这里每个编译器都有自己的函数名修饰规则。由于Windows下vs的修饰规则过于复杂,而Linux下g++的修饰规则简单易懂。在linux下,采用gcc编译完成后,函数名字的修饰没有发生改变。采用g++编译完成后,函数名字的修饰发生改变,编译器将函数参数类型信息添加到修改后的名字中。g++的函数修饰后变成【_Z+函数长度 +函数名+类型首字母】。

????????通过这里就理解了C语言没办法支持重载,因为同名函数没办法区分。而C++是通过函数修饰规则来区分,只要参数不同,修饰出来的名字就不一样,就支持了重载。

2.C++支持函数重载的好处

? ? ? ? 我们只需要将重名函数中的参数修改成不一样的,这样在使用的时候就只需根据自己的需要修改参数即可,而无需修改函数名。比如swap函数:在C语言中我们使用的时候一个函数名只能是一种类型进行交换,需要进行第二种类型交换时,还需要在重新定义一个新的函数名。在C++中可以函数名相同,只需要将参数修改即可使用,使用的时候一个函数两种用法还是比较爽的。

3.函数重载的一些注意事项

  • 在两个或多个函数重名的时候,函数的参数必须有其中一种不同(参数类型,参数个数,参数顺序),否则在使用的时候就会报错,编译器不知道该调用哪个了,会产生歧义(二义性)。
  • 在函数重名的时候,参数使用缺省参数,也需要特别注意
int f()
{
    
    return 0;
}

int f(int a = 10,int b = 20)
{
    return a + b;
} 

int main()
{
    count << f(1) << endl;
    count << f(1,2) << endl;;
    count << f()<< endl;//在这里会产生歧义,编译器不知道调用哪个   

}
  • 如果两个函数函数名和参数是一样的,返回值不同是不构成重载的,因为调用时编译器没办 法区分。

那么内容就先到这里,请期待后面的文章。

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-09-24 20:38:18  更:2022-09-24 20:39:39 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 9:41:59-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码