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++基础知识(一)

之前学习的C语言是面向过程,C++则是面向对象(类)的,两者在代码书写上就具有一定的区别。

#include <iostream>//输入输出流
using namespace std;//命名空间
int main(){
	int a = 10;
	cout<<"a ="<<endl;
	return 0;
}

这里的cout即输出对象流,相当于C语言中的printf;
cin为输入对象流,相当于C语言中的scanf;
<<是插入符,又称输出运算符;
endl相当于C语言中的\n。

一.命名空间

1.命名空间的定义
在C++中,定义命名空间可以使用关键字namespace,后面加命名空间的名字,然后接一对{ }即可,{ }中即为命名空间的成员。一个命名空间就相当于一个新的作用域,在该命名空间下的所有成员都仅限于这个命名空间中。

namespace N1 {
	int a;
	int add(int left, int right) {
		return left + right;
	}
}

命名空间中的内容,既可以定义变量,也可以定义函数,且命名空间可以嵌套。
2.命名空间的使用
首先先来看一段代码:

namespace N1 {
	int a = 10;
	int add(int left, int right) {
		return left + right;
	}
}

int main() {
	cout << a << endl;//该语句编译出错,a为未声明的标识符
	return 0;
}

那命名空间中的成员该如何使用呢?
命名空间的使用有三种方式:
(1)使用命名空间名称加作用域解析符

namespace N1 {
	int a = 10;
	int add(int left, int right) {
		return left + right;
	}
}

int main() {
	cout << N1::a << endl;
	return 0;
}

(2)使用using将命名空间引入

namespace N1 {
	int a = 10;
	int add(int left, int right) {
		return left + right;
	}
}

using N1::a;
int main() {
	cout << a << endl;
	return 0;
}

(3)使用using namespace命名空间名称引入

namespace N1 {
	int a = 10;
	int add(int left, int right) {
		return left + right;
	}
}

using namespace N1;
int main() {
	cout << N1::a << endl;
	return 0;
}

二.缺省参数

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

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

缺省参数分为全缺省参数和半缺省参数

  • 全缺省参数:即所有函数均设定一个缺省值
void Testfun(int a = 1, int b = 2, int c = 3) {
	cout << "a=" << a << endl;
	cout << "b=" << b << endl;
	cout << "c=" << c << endl;
}
  • 半缺省参数:即部分参数设定缺省值
void Testfun(int a , int b = 2, int c = 3) {
	cout << "a=" << a << endl;
	cout << "b=" << b << endl;
	cout << "c=" << c << endl;
}

注意:半缺省参数必须从右往左以此给出,不能间隔省略
缺省参数不能在函数声明和定义中同时出现
缺省值必须是常量或全局变量
C语言不支持缺省参数

三.函数重载

函数重载是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数 或 类型)必须不同,可以用来实现功能类似但数据类型不同的问题。说通俗点,函数重载就相当于名字相同的两个人。

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

int main() {
	cout << add(1, 2) << endl;
	cout << add(1.0, 2.0) << endl;
	return 0;
}

输出结果:3 3
作为函数名相同的两个函数,编译器是怎么知道我们想要调用哪个函数呢?
要知道,编译器在进行编译的过程中,会根据函数名,参数类型等重新修饰一个函数名,该函数名在全局上是唯一的。所以说,在调用重载函数时,编译器就会调用我们想要的重载函数。

什么是修饰规则呢?
在这里插入图片描述

在windows下,我们以int N::C::func(int)这个函数名来猜测VC++中的名称修饰规则(了解即可)。修饰后的名字由“?”开头,接着是函数名由“@”符号结尾的函数名:后面跟着由“@”结尾的类名“C”和空间名称“N”,在一个“@”表示函数的名称空间结束;第一个“A”表示函数的调用类型,接着是函数的参数类型及返回值,由“@”结束,最后由“Z”结尾。可以看到函数名、参数类型和空间名称都被加入了修饰后名称,这样编译器和链接器就可以区别同名但不同参数类型或名字空间的函数。

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

我们在使用C++编写程序时,可以在函数前加上extern “C”来表示扩展到C语言进行编译。
看到过这样一段代码:

extern "C" int add(int left, int right);//只声明没定义

int main() {
	add(10, 20);
	return 0;
}

程序在链接时会报错:error LNK2019: 无法解析的外部符号 _add,该符号在函数 _main 中被引用。也就是说编译器已经将函数名修饰为_add,使用了C语言的编译规则。

注意:判断两个函数是否属于重载,不能只依靠返回值。

四.引用

1.定义:引用是给原有空间取了一个别名,编译器不会为其开辟新的空间。
类型&引用变量名(对象名)= 引用实体

int main() {
	int a = 10;
	int &b = a;//定义引用类型
	cout << "a=" << a << endl;
	cout << "b=" << b << endl;
}

注意:引用类型必须和引用实体是同种类型的
2.引用特性
(1)引用在定义时必须初始化
(2)一个变量可以有多个引用
(3)引用一旦引用一个实体,再不能引用其他实体
3.常引用

void Test() {
	const int a = 10;
	int &ra = a;
	const int &ra = a;
	int &b = 10;
	const int &b = 10;
}

在编译时,int &ra = a 和int &b = 10这两行均会出错,是因为a和b都是常量,不能被引用

int& add(int a, int b) {
	int c = a + b;
	return c;
}
int main() {
	int &ret = add(1, 2);
	add(3, 4);
	cout << "add(1,2)is:" << ret << endl;
	return 0;
}

上述代码运行结果是7,为什么呢?
如果函数返回时,出了函数作用域,如果返回对象未还给系统,则可以使用引用返回,如果已经还给系统,则必须使用传值返回。(创建无名临时空间 c)

4.传值、传引用效率比较
以值作为参数或者返回值类型,在传参和返回期间,函数不会直接传递实参或者将变量本身直接返回,而是传递实参或者返回变量的一份临时的拷贝,因此用值作为参数或者返回值类型,效率是非常低下的,尤其是当参数或者返回值类型非常大时,效率就更低。

5.引用和指针的比较
引用在底层实现上实际是有空间的,因为引用是按照指针方式来实现的。

引用和指针的不同点:

  1. 引用在定义时必须初始化,指针没有要求
  2. 引用在初始化时引用一个实体后,就不能再引用其他实体,而指针可以在任何时候指向任何一个同类型实体
  3. 没有NULL引用,但有NULL指针
  4. 在sizeof中含义不同:引用结果为引用类型的大小,但指针始终是地址空间所占字节个数(32位平台下占4个字节)
  5. 引用自加即引用的实体增加1,指针自加即指针向后偏移一个类型的大小
  6. 有多级指针,但是没有多级引用
  7. 访问实体方式不同,指针需要显式解引用,引用编译器自己处理
  8. 引用比指针使用起来相对更安全

五.内联函数

1.概念:以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数压栈的开销,内联函数提升程序运行的效率。
2.特性:
(1)内联函数能够提升程序运行的效率。
(2)inline关键字必须和函数定义放在一起才可以实现内联,仅仅将inline放在函数声明之前不起任何作用。inline是一个用于实现的关键字而不是一个用于声明的关键字。

  1. inline是一种以空间换时间的做法,省去调用函数额开销。所以代码很长或者有循环/递归的函数不适宜使用作为内联函数。
  2. inline对于编译器而言只是一个建议,编译器会自动优化,如果定义为inline的函数体内有循环/递归等等,编译器优化时会忽略掉内联。
  3. inline不建议声明和定义分离,分离会导致链接错误。因为inline被展开,就没有函数地址了,链接就会找不到。
  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-10-04 12:40:48  更:2021-10-04 12:42:17 
 
开发: 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年5日历 -2024/5/19 22:40:25-

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