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++的区别

一、源文件、头文件与命名空间

源文件

C语言的源文件为.c文件,但是c++的头文件是.cpp,这也是在之前的学习中,
我们每次在创建新的文档的时候,选择.c的原因,虽然c++语法兼容C语言的语法,
但是两者还是有区别的。

头文件

C语言里我们引入头文件的方式在c++里面依旧适用

我们可以使用原来的include引入
//系统头文件的引入方式(从整个系统指定的目录中查找该头文件)
#include <stdio.h>	
	
//自定义头文件的引入方式(从当前目录中查找该头文件,没有则到系统指定的目录中查找,所以此处的头文件可以和系统的头文件名相同)
#include "myHeah.h"		

引入库文件

也可以使用c++中特定的引入方式引入库文件,也就是去掉.h在前面加一个c
//去掉.h前面加一个c
#include <cstdio>	//c++中引入C语言头文件的时候
c++中的标准头文件为iostream,它是c++中的标准输入输出的头文件,
类似于C语言中的stdio.h
#include <iostream>		//标准输入输出的头文件

命名空间

首先我们来说一下为什么C++为什么要引入命名空间

在我们的C/C++语言中,变量、函数以及类都是大量存在的,这些变量、函数以及类
都是存在于全局域中的,一不小心,我们就有可能有冲突,在我们的C语言中,我们
只能靠将名字尽量起的复杂一点来解决这个问题,但是也还是无法完全避免,所以
为了避免这种冲突,C++就引入了命名冲突这种机制,来避免命名冲突,解决命名冲
突的问题

命名空间的语法

空间的定义

namespace 空间命
{
	//空间中的元素
}
  • 例如:
#include <cstdio>
using namespace std;	//后面会有这句话的解释
namespace Tihu
{
	int age = 23;
	//在命名空间中可以只给出函数的声明,函数的定义可以放到空间外,
	void print1();
	//同样的,也可以在声明的时候定义函数
	void printf()
	{
		printf("新手上路,请多关照!\n");
	}	
}
//但是函数名前须有这个函数的空间名
void Tihu::print1()
{
	printf("大家好,我是Tihu\n");
}

空间的使用

int main(){
	空间命::空间内的元素;
	return 0;
}
  • 例如:
int main(){
	Tihu::age = 18;
	Tihu::print1();
	Tihu::print2();
	return 0;
}

空间的作用域分辨符

::它就是作用域分辨符
1. 空间命限定,用于区分某个标识符是属于哪个空间中的元素
2.用于标识全局变量
int age = 0;
int main(){
	Tihu::age = 19;	//表明这里的这个age是Tihu里面的那个age
	::age = 19;		//用::且没有空间名,所以表示全局标量中的那个age
	return 0;
}

using的使用

  • using的作用
由于每一次使用空间中的元素时都得使用空间命::元素名的方式来访问,
这样显得比较繁琐,因此有了using的出现,它可以是我们每一次使用这
个空间中的元素时,免去这个元素前的那一长串的出现
  • using的使用
  • 只在当前作用域有效
 //这也是为什么会有上面那一行代码的出现,
 using namespace 空间命	

空间的嵌套

  • 函数可以有嵌套,空间同样可以有嵌套,一个空间元素的使用需要在空间与元素之间有作用域分辨符的出现,那么嵌套的空间也算是最外围空间的一个元素,因此他们之间也需要有作用域分辨符的出现
  • -例如:
namespace A
{
	namespace B
	{
		int age = 99;
		void print(int age)
		{
			printf("Tihu今年%d岁,又比去年年轻一岁!",age);
		}
	}
}
//函数的使用
A::B::print(A::B::age);

//加上using语法后
using namespace A::B;
print(age-1);

二、基本的输入输出

  • 需要加入c++的标准输入输出头文件iostream
    #include <iostream>

  • 通常都会加上命名空间
    using namespace std;

  • 对于c++中特有的输入输出,他们不像C语言中的printf和scanf那样需要格式控制,直接输入就好。

输出

  • 通常用cout<<做输出

    cout<<"Tihu还很年轻!"<<endl;

  • 打印多个数据

int a = 0;
int b = 1;
cout<<a<<b<<"\n";
  • 打印里面的强制转换
cout<<(float)a<<float(b)<<"\n";
  • 打印里面的换行
我们可以使用C语言里面的”\n“换行,但是c++里面有特定的换行符,"endl"
`cout<<a<<endl;`

输入

  • 输入用cin>>直接输就可以了
    -cin>>a;
  • 输入多个数据
  • cin>>a>>b>>c;
 这里有一个问题,由于cin默认用空格分开,因此对于字符型的输入,如果里面有空格,那么他就会中断
-例如:
char str[100];
char c;
cout<<"请输入:";
cin>>str>>c;
请输入:I'm so clever
cout<<"str里面的内容:"
cout<<str<<endl;
cout<<"c里面的内容";
cout<<c<<endl;
str里面的内容:I'm
c里面的内容为:s

所以我们这里就会出现无法输入空格的问题,在这里我们可以使用

	//接受空格的输入--->了解
	cin.getline(str, 10);		//gets_s(str, 10);
	cout.write(str, 10);

三、新的数据类型

bool类型

- 占用计算机中的一个字节
- 非零表示成立,只有0和指针空为不成立
- 一般充当开关使用
- 正常输出为0和1
- c++中特有的赋值方式true和false
`bNum = false;`
`bNum = true;`
- 特有的输出bool的方式
	 `cout<<boolalpha<<bNum<<endl;`

指针为空NUUL在c++中表示为nullptr

通常用的时候用nullptr

int* p = nullptr;

因为NULL有时候表示为0,传参的时候可能会出现问题

引用类型

  • 理解为起别名

  • 基本引用

    类型名& 别名 = 要起别名的标识符

int a = 1;
int& b = a;	
这里的b就是a的别名,并且这个要起别名的变量要存在
对b进行操作,等同于对a进行操作
另外如果函数传参为常量,那么形参必须使用const关键字
使用了const后,就既可以传入变量,也可以传入常量
void print(const char* str)
{
	cout<<str<<endl;
}
  • 常引用(右值引用)

    类型名&& 别命 = 常量

如果想要给常量其引用,那么它跟给变量起别名不一样
 - 用const去修饰
	const int& x = 1;
 - 右值引用
	int&& xx = 1; 	(只能给等式右边起引用,不能给左值起别名)
  • 引用的使用地方

    • 传参的使用
修改指针的指向,在C语言中我们要使用二级指针,而在这里,我们可以使用指针的
引用来改变指针的指向
void modifyPointB(int*& p);
右值引用
void printRight(const int& a)
{
	a+=10;
	cout<<a<<endl;
}
  • 除了这些,它还可以当作函数的返回值
返回引用表示返回变量本身
num = 10;
int& g_num()
{
	return num;
}
g_num() = 0;	//这里将g_num当作变量num使用,可以改变num的值
cout<<"num = "<<num<<endl;
num = 0
  • 自动推断类型auto
必须根据赋值类型推断类型,不能直接推断(即变量必须初始化)
auto a = 1;

四、函数思想

内敛思想 inline关键字

只有短小精悍的函数才可以成为内敛函数
inline int Max(int a,int b)
{
	return a>b?a:b;
}
在结构体中或者类中实现的函数默认内敛

函数重载: C++允许同名不同参数函数存在

1. 参数数目不同
2. 参数类型不同
3. 参数顺序不同(一定建立在不同类型的基础上)
	优先调用类型一致的函数(如果迫不得已,它会默认隐式转换)
oid print(int a, int b) 
{
	cout << a + b << endl;
}
//和上面不是顺序不同
//void print(int b, int a) 
//{
//	cout << a + b << endl;
//}
void print(int a, char b) 
{
	cout << "int,char" << endl;
	cout << a + b << endl;
}
void print(char a, int b)
{
	cout << a + b << endl;
}

函数缺省: C++中允许给函数形参初始化

1. 缺省顺序 必须从右往左缺省,缺省的参数中间不能存在没有缺省的
2. 没有参入参数,使用的是默认值
  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-11-14 21:25:37  更:2021-11-14 21:25:58 
 
开发: 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/24 8:01:29-

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