广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++超详细梳理基础知识
  • 657
分享到

C++超详细梳理基础知识

2024-04-02 19:04:59 657人浏览 泡泡鱼
摘要

目录命名空间的使用来源命名空间的使用不展开部分展开全展开函数重载函数重载的规则c++如何实现函数重载引用命名空间的使用 来源 在了解命名空间的原理和使用之前,我们先要理解,命名空间是

命名空间的使用

来源

在了解命名空间的原理和使用之前,我们先要理解,命名空间是为了解决什么问题。

C++是在C的基础上发展而形成的一种语言,完全兼容C的语法,也加入了许多新的规则和语法来解决C的缺陷。

命名空间就是为了解决C语言中的重复命名的问题。

首先我们来看看这么一个代码:

#include<stdio.h>
int main()
{
	int scanf = 20;
	printf("%d", scanf);
	return 0;
}

我们都知道scanf在C之中是一个函数名,但诡异的是我们在主函数中声明scanf是有效的并且输出结果是20.

在这个程序内的scanf就是表示是一个int型整数,这是根据就近原则或者说是局部优先原则确定的。

接下来我们看看另一个程序:

#include<stdio.h>
int main()
{
	int scanf = 20;
	scanf("%d", &scanf);
	printf("%d", scanf);
	return 0;
}

在我们想要scanf作为函数使用时出现了问题,两者之间命名冲突。

在C语言中我们被告诫不要让变量名与函数名冲突,但是在C++中有没有合适的解决方法呢?

命名空间的使用

我们先来书写一个在C++中最为简单的程序:

#include<iOStream>
using namespace std;
int main()
{
	cout << "hello  world" << endl;
	return 0;
}

这里我们就看到了namespace命名空间,但是现在它是用来干什么的我们还不清楚,首先我们先来了解一下它。

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

让我们从代码方面来看看命名空间到底是什么:

#include<iostream>
using namespace std;
namespace  N1
{
	int printf = 30;
	int strlen = 20;
}
int main()
{
	cout << "hello  world" << endl;
	cout << N1::printf << endl;
	return 0;
}

我们声明了一个命名空间N1,在内部声明了两个int类型的变量,通过作用域限定符::我们就可以调用命名空间中的变量。

并且命名空间中也可以嵌套命名空间:

namespace  N1
{
	int printf = 30;
	int strlen = 20;
	namespace  N2
	{
		int a = 0;
	}
}

通过上面的解释,我们明白了,命名空间适用于将声明的名称之间相互隔离,防止命名冲突。比如说,我们调用N1::printf时,::将范围限定在N1这个命名空间之中,而不会与函数名printf冲突,反之亦然。

那么一开始我们看到的那个程序是什么意思呢?

我们先来看另一个版本的程序:

int main()
{
	std::cout << "hello  world" << std::endl;
	//cout << N1::printf << endl;
	return 0;
}

显然std也是一个命名空间,通过作用域限定符调用命名空间std内的内容。

那么一开始的

using namespace std;

是用来干嘛的呢?

using的作用是把命名空间中的内容在全局空间中展开,命名空间中的变量就成为了全局变量,调用时就不需要命名空间名加上作用域限定符了。

实际上命名空间有三种使用方式,各有优劣。

不展开

也就是

std::cout << "hello  world" << std::endl;

的方式,要使用命名空间中的名称,就要使用::来限定命名空间,完全避免了冲突,在大工程中使用。缺点就是在日常练习中书写代码较为繁琐。

部分展开

使用using将命名空间中成员引入,将一些我们常用的符号在全局中展开,就可以大大简化代码,是在第一个方法和第三个方法之间取一个折中。

using std::cout;
using std::endl;
int main()
{
	cout << "hello  world" << endl;
	//cout << N1::printf << endl;
	return 0;
}

全展开

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

using namespace std;
int main()
{
	cout << "hello  world" << endl;
	//cout << N1::printf << endl;
	return 0;
}

这个方法是有问题的,相当于一夜回到解放前。好不容易搞个命名空间隔离了,结果一行代码全给展开了,直接在全局空间声明,完全没有防止命名冲突的作用,只在日常练习中使用。

函数重载

函数重载的规则

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

比如:以前有一个笑话,国有两个体育项目大家根本不用看,也不用担心。一个是乒乓球,一个是男足。前者是“谁也赢不了!”,后者是“谁也赢不了!”

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

比如下面的相加函数:

int Add(int left, int right)
{
return left+right;
}
double Add(double left, double right)
{
return left+right;
}
long Add(long left, long right)
{
return left+right;
}
int main()
{
Add(10, 20);
Add(10.0, 20.0);
Add(10L, 20L);
return 0;
}

虽然函数名相同,但是所带参数的类型不同,所以在调用的时候能够调用不同的函数定义,让函数的使用更加灵活。

这里要特别注意的是函数重载的规则:同名函数的形参列表(参数 个数 或 类型 或 顺序)必须不同。

short Add(short left, short right)
{
return left+right;
}
int Add(short left, short right)
{
return left+right;
}

那么两个同名函数,算不算是函数重载呢,显然他们的形式参数的个数 ,类型以及 顺序都是一样的,只是返回类型不同,不构成重载函数。

C++如何实现函数重载

我们都知道C是没有函数重载这个功能的,那么C++是怎么实现的呢?

其实是通过C++的函数名修饰来实现函数重载的。

大家这里可能有一些迷糊,这需要我们对代码的编译过程有一定的了解:

C和C++的区别在于,在编译的符号汇总中,C语言是使用函数的原名进行汇总的,导致了一个名称只能对应一个函数,所以不能进行函数重载。

但是在C++中,符号汇总起来的是经过修饰的函数名,即使原名称一样,由于参数 个数 或 类型 或 顺序不同,经过修饰后的符号名也不同,比如说:

int Add(int left, int right)
{
return left+right;
}
 
double Add(double left, double right)
{
return left+right;
}
 
long Add(long left, long right)
{
return left+right;
}

比如说这三个函数经过函数名修饰之后就变成了——Addii、ADDDd、Addll。于是我们在后续的使用中就可以很好地区分这三个函数了,即使在我们看来这三个函数名是一样的,但是在计算机看来这三个完全就是三个不一样的函数。

引用

引用可以说就是给变量取别名。是怎么实现的呢?

#include<iostream>
int main()
{
	int a = 0;
	int b = 0;
	int& c = a;
	c = 10;
	return 0;
}

其中 int& c = a; 就是把c作为a的别名,这时c和a指向的内存空间是同一块。

当改变c的值时,a中的值同时改变。

但是,在使用过程中也有一些需要注意的事项——

1.引用类型必须和引用实体是同种类型的

2.引用在定义时必须初始化

int a;
int& b = a;

3.一个变量可以有多个引用

int a = 0;
int& b = a;
int& c = a;
int$ d = c;

4.引用一旦引用一个实体,再不能引用其他实体

#include<iostream>
int main()
{
	int a = 0;
	int b = 0;
	int& c = a;
	int& c = b;
	c = 10;
	return 0;
}

到此这篇关于C++超详细梳理基础知识的文章就介绍到这了,更多相关C++基础内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C++超详细梳理基础知识

本文链接: https://www.lsjlt.com/news/152377.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C++超详细梳理基础知识
    目录命名空间的使用来源命名空间的使用不展开部分展开全展开函数重载函数重载的规则C++如何实现函数重载引用命名空间的使用 来源 在了解命名空间的原理和使用之前,我们先要理解,命名空间是...
    99+
    2022-11-13
  • Maven基础知识大梳理
    目录Maven工程基础知识Maven仓库的分类Maven常用命令的含义一个项目生命周期打包类型:<packaging >依赖范围:<scope>聚合与继承的关...
    99+
    2022-11-12
  • Java基础之数组超详细知识总结
    目录一、一维数组二、二维数组三、总结一、一维数组 1、Java语言中的数组是一种 引用数据类型。不属于基本数据类型。数组的父类是 Object。 2、数组实际上是一个容器,可以同时容...
    99+
    2022-11-12
  • Vue基础语法知识梳理下篇
    目录计算属性键盘事件监视属性绑定样式class样式style样式条件渲染v-ifv-show列表渲染v-for指令vue监测data中的数据收集表单数据计算属性 定义:要用的属性不存...
    99+
    2022-12-12
    Vue语法 Vue基础 Vue原理
  • C++超详细梳理IO流操作
    目录1.标准输出输入流-控制台流(iostream类) 2. 文件流(I/O操作)文本文件使用<< >> 进行读写getline()读取一行get(...
    99+
    2022-11-13
  • PHP基础知识详细讲解
    目录一、简介二、php基本语法三、变量和作用域四、常量五、数据类型六、运算符七、流程控制八、超全局变量一、简介 基础知识: 需要一定的html和css的语法知识 基本概念: PHP(...
    99+
    2022-12-03
    PHP基础知识 PHP基础语法
  • MySQL基础知识(一)-超详细Windows系统安装MySQL详细教程
    1.简介   原计划,今天这篇想要给小伙伴们讲解一下python操作mysql数据库,但是由于近期换了一台新的电脑,所以一看mysql数据库都没安装,所有才有了这篇文章。尽管网上不乏此类型的文章,但是刚好自己要安装,所以就总结和分享一下下了...
    99+
    2023-08-31
    mysql windows 数据库 软件测试 程序人生
  • Android知识体系梳理(2)-Java基础篇
    一、开篇 开篇写这一篇的时候,我就感觉到任重而道远。java基础,这短短几个字,要怎么样才能用一篇博文梳理明白? 但还好,既然是知识体系,那么就是讲重点,讲概念。 二、基本类型...
    99+
    2022-06-06
    java基础 JAVA Android
  • C++类与对象的基础知识点详细分析
    目录一、什么是类和对象呢1、类的引入2、类的定义3、类的访问限定符4、类对象的储存方式5、this指针的特性二、类的六个默认成员函数详解1、构造函数2、析构函数一、什么是类和对象呢 ...
    99+
    2023-02-13
    C++类与对象知识点 C++类与对象关系
  • mysql+sqlyog的超详细完整安装+数据库基础知识
    目录 一、安装mysql下载解压添加环境变量创建文件启动mysql安装mysql 二、sqlyog安装sqlyog下载 三 补充3.1 常用的数据库命令3.2 基本操作3.2.1 常用...
    99+
    2023-10-12
    mysql 数据库 oracle
  • C/C++网络编程基础知识超详细讲解上部分(系统性学习day11)
    目录 前言 一、网络的含义与构成 含义: 构成:  二、网络的体系结构 1>OSI七层模型 2>TCP/IP协议体系结构  3>数据经过体系结构,怎么封装  4>端口号 5>大小端序 6>TCP/UDP传输层的协议  三、系统函数API学...
    99+
    2023-10-21
    网络 学习 c语言 c# 开发语言
  • Webshell的基础知识点详细分析
    这篇文章主要介绍Webshell的基础知识点详细分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一、什么是Webshell?顾名思义,“web”的含义是显然需要服务器开放web服务,“shell”的含义是取得对服务...
    99+
    2023-06-07
  • Java Swing最详细基础知识总结
    目录一、简介二、Swing 组件的层次结构三、Swing组件3.1 JFrame窗体组件3.2 JDialog窗体组件3.3 JLabel组件3.4 文本域3.5 按钮四.布局管理器...
    99+
    2022-11-12
  • C语言语义陷阱超详细梳理总结
    目录1 指针与数组2 非数组的指针3 作为参数的数组声明4 空指针并非空字符串5 边界计算与不对称边界6 求值顺序7 整数溢出8 为函数提供返回值1 指针与数组 C语言中只...
    99+
    2022-11-13
  • C++超详细梳理lambda和function的使用方法
    目录lambda表达式谈谈lambda的捕获万能的functionbind操作lambda表达式 lambda表达式又称为匿名表达式,是C11提出的新语法。[]存储lambda表达式...
    99+
    2022-11-13
    C++ lambda C++ function
  • C++ 超详细梳理继承的概念与使用
    目录继承的概念及定义继承的概念继承定义定义格式继承关系和访问限定符继承基类成员访问方式的变化基类和派生类对象赋值转换继承中的作用域派生类的默认成员函数继承与友元继承与静态成员复杂的菱...
    99+
    2022-11-13
  • 计算机网络基础知识(非常详细)
    1. 网络模型 1.1 OSI 七层参考模型 七层模型,亦称 OSI(Open System Interconnection)参考模型,即开放式系统互联,是网络通信的标准模型。一般称为 OSI 参考模型或七层模型。 它是一个七层的、抽象的模...
    99+
    2023-09-12
    网络 服务器 运维
  • 前端组件化基础知识详细讲解
    目录组件的基本概念对象与组件的区别组件 Component特性 AttributeAttribute 对比 PropertyAttribute:Property:Class 属性St...
    99+
    2022-11-12
  • C语言入门之基础知识详解
    目录一、思维导图二、环境搭建三、编码规范四、基本数据类型五、分支循环5.1 分支5.2 循环六、break与continue6.1 无限循环一、思维导图 内容不限于此思维导图 二、...
    99+
    2022-11-12
  • C语言操作符基础知识详解
    目录一.单目操作符:二.关系操作符三.条件操作符四.逗号表达式五.逻辑操作符总结一.单目操作符: !:逻辑反操作符; -:负数操作符; +:整数操作符; &:取地址操作符; ...
    99+
    2022-11-12
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作