一、源文件、头文件与命名空间
源文件
C语言的源文件为.c文件,但是c++的头文件是.cpp,这也是在之前的学习中,
我们每次在创建新的文档的时候,选择.c的原因,虽然c++语法兼容C语言的语法,
但是两者还是有区别的。
头文件
C语言里我们引入头文件的方式在c++里面依旧适用
我们可以使用原来的include引入
#include <stdio.h>
#include "myHeah.h"
引入库文件
也可以使用c++中特定的引入方式引入库文件,也就是去掉.h在前面加一个c
#include <cstdio>
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 = 19;
return 0;
}
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 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);
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;
cout<<"num = "<<num<<endl;
num = 0
必须根据赋值类型推断类型,不能直接推断(即变量必须初始化)
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 a, char b)
{
cout << "int,char" << endl;
cout << a + b << endl;
}
void print(char a, int b)
{
cout << a + b << endl;
}
函数缺省: C++中允许给函数形参初始化
1. 缺省顺序 必须从右往左缺省,缺省的参数中间不能存在没有缺省的
2. 没有参入参数,使用的是默认值
|