文章目录
- 前言
-
- 1、C++首个程序
- 2、namespace关键字
- 3、C++输入/输出
- 4、缺省参数
- 5、函数重载
- 6、C++中的引用
- [7、const 引用](#7、const 引用)
- 8、指针和引用的关系
- 9、inline关键字
- 10、nullptr关键字
前言
此篇文章主要简述流程:C++首个程序 -> namespace关键字 -> C++输入/输出 -> 缺省参数 -> 函数重载 -> 引用。
1、C++首个程序
- C语言中第一个程序的写法:
c
//C语言中的第一个程序
#include<stdio.h>
int main()
{
printf("Hello World!\n");
return 0;
}
- C++第一个程序的写法:
cpp
//C++语言第一个程序
#include<iostream>
using namespace std;
int main()
{
cout << "Hello World!" << endl;
return 0;
}
从对比可以看出两者的差异,一开始只要记住该格式就ok!
2、namespace关键字
含义:命名空间。
主要作用:解决命名冲突的问题。(变量名、函数名、类型名);
- 在C++中,4大区域:函数局部域、全局域、命名空间域、类域;其中函数局部域和全局域会影响编译查找逻辑和变量的生命周期,后两者不会影响影响变量的周期。
namespace的定义:
格式:
namespace { 函数、变量、类型 }
注意:namespace只能定义在全局区,也就是主函数的外面,同=时支持嵌套定义。具体例子如下:
- 这个例子可以看出命名冲突的情况:
cpp
#include<iostream>
int rand = 10;
int main()
{
printf("%d\n",rand);
return 0;
}
- 解决上面的问题就用到namespace。
cpp
#include<iostream>
namespace variable
{
int rand = 10;
}
int main()
{
printf("%d\n",rand);
return 0;
}
写成这样可以解决命名冲突的问题,但怎样访问自己定义的rand数据呢?需要用C++中的作用域::
cpp
#include<iostream>
namespace variable
{
int rand = 10;
}
int main()
{
printf("%d\n",variable::rand);
return 0;
}
3、C++输入/输出
- 头文件
<iostream>
表示input output stream的缩写,是标准的输入、输出流库。 - std::cin是istream类的对象,主要面向窄字符的标准输入流。
- std::cout是ostream类的对象,主要面向窄字符的标准输出流的。
cpp
//C++输入/输出
#include<iostream>
using namespace std;
int main()
{
cout<<"C++你好!"<<endl;//endl就是换行的
return 0;
}
4、缺省参数
- 缺省参数的含义:简单说就是我们在声明或定义函数的时候,给参数给定一些初始值,当我们在调用函数的时没给实参的时候就会用参数中的初始值。
- 分类:全缺省参数、半缺省参数。
- 全缺省参数:给函数的形参都给一个初始值(缺省值);
- 半缺省参数:给函数中部分形参给缺省值。
- 注意:C++规定半缺省参数的时候,必须从右往左一次缺省(给初始值),必须是连续的,不能间隔。
- 当函数的声明和定义分开的时候,缺省参数不能再声明和定义中同时出现,规定必须函数声明给缺省值。
代码例子如下:
cpp
//缺省参数
#include<iostream>
using namespace std;
//全缺省参数
void func1(int number=20)
{
cout << "number=" << number << "\n";
}
int main()
{
func1();
func1(666);
return 0;
}
- 全缺省参数和半缺省参数
cpp
//全缺省参数和半缺省参数的区别
#include<iostream>
using namespace std;
//全缺省参数
void func2(int a=10,int b=20,int c=30)
{
cout << "a+b+c=" << a + b + c << "\n";
}
//半缺省参数
void func3(int a,int b=20,int c=30)
{
cout << "a+b+c=" << a + b + c << "\n";
}
int main()
{
func2();
func3(40);
return 0;
}
5、函数重载
- 含义:在同一作用域中出现相同的函数名。在C++中函数重载可以表现出多态的行为,使用更灵活。
- 函数重载的条件:①函数名必须相同。②访问修饰符无要求。③返回值类型无要求。④函数的参数列表必须不同(参数个数不同、参数类型不同、参数的顺序不同)。
下面是函数重载的例子:加法函数实现不同类型的相加
cpp
//函数重载
#include<iostream>
using namespace std;
void Add(int a, int b)
{
cout << "a+b=" << a + b << "\n";
}
void Add(double a, double b)
{
cout << "a+b=" << a + b << "\n";
}
int main()
{
Add(10, 20);
Add(1.5, 1.5);
return 0;
}
6、C++中的引用
- 引用的概念:记住一句话就是引用就是给变量取别名,并且编译器不会给引用变量开辟内存空间的,它和引用的变量共用一个内存空间(原来的内存空间)。简单例子就是《水浒传》各个英雄好汉的外号。
- 引用的定义格式:
类型名& 引用的别名 = 引用对象;
在语言中&表示取地址,C++中是引用别搞混了喔。
我们在使用引用的时候的注意事项:
①引用在定义必须初始化。
②一个变量可以有多个引用,但是一个一会引用只能用于一个变量(引用一旦引用了一个实体后,就不能引用其他实体了)。
③引用也可以被引用。(就是一个变量被引用后,那个引用的又可以取别名。)
- 引用的具体应用:
①主要用于函数传参和函数的返回值,这样可以减少拷贝从而提高效率。
②在改变引用后,被引用对象会跟着改变。 - 具体例子如下:
cpp
//引用的应用(交换两个数)
#include<iostream>
using namespace std;
void Swap(int& a, int& b)
{
int tmp = a;
a = b;
b = tmp;
}
int main()
{
int number1 = 100;
int number2 = 200;
cout << "number1=" << number1 << " " << "number2=" << number2 << "\n";
Swap(number1, number2);
cout << "number1=" << number1 << " " << "number2=" << number2 << "\n";
return 0;
}
可以看到引用的变量和被引用对象是同一个内存空间。
7、const 引用
const引用就是被引用对象是const修饰的。
- 在使用const 需要提到权限缩放。例如:
cpp
//const 引用
#include<iostream>
using namespace std;
int main()
{
权限放大
//const int number = 10;//只读的权限,因为const修饰的
//int& rnu = number;//变为了可读可写的,因此报错
//权限缩小可以
int number2 = 30;
const int& rnu = number2;
cout << "rnu=" << rnu << "\n";
//平级的可以
int number3 = 40;
int& rnu1 = number3;
cout << "rnu1=" << rnu1 << "\n";
return 0;
}
- 临时对象的情况:产生条件是一个表达式、函数调用返回值、类型转换。编译器需要⼀个空间暂存表达式的求值结果时临时创建的⼀个未命名的对象,在C++中把这个未命名对象叫做临时对象。
- 比如说:
cpp
#include<iostream>
using namespace std;
int main()
{
int a = 10;
int b = 20;
//int& rab = a + b;//a+b是临时变量,临时变量具有常性,需要const修饰
const int& rab1 = a + b;
cout << "rab1=" << rab1 << "\n";
return 0;
}
8、指针和引用的关系
①首先从语法上看,引用就是给变量取别名,不用开辟内存空间,是和被引用对象共用内存空间的;但是指针是存储变量的地址的,是需要开辟新的内存空间的;
②从使用角度看,引用在使用的时候必须初始化的,而指针从语法不是必须初始化的,但是建议初始化,避免野指针。
③引用在引用一个对象后,就不能再引用其他对象,但是指针可以不断改变指向的对象。
④引用可以直访问所指的对象,而指针需要解引用才可以。
⑤在引用的条件下,sizeof表示引用类型的大小,但是指针使用sizeof则是表示不同操作系统下所占字节个数(32位中占4位,64位下占8位)
⑥从安全角度看,指针很容易出现野指针,而引用相对来说不太容易出现。
9、inline关键字
inline关键字:只要是该关键字修饰的函数叫做内联函数。我们在编译C++编译器的时候,会在调用函数的地方展开内联函数,这样调用内联函数就需要建立栈帧,从而提高效率。
应用地方:主要是用于频繁调用的短小的函数。不适合递归函数。
10、nullptr关键字
nullptr实质是一个宏;
在C++中,NULL定义成为了0,然而在C语言中被定义成为的是空指针;为了防止下面错误的发生:
于是在C++中又定义了nullptr指针,是一种特殊的关键字,它可以转换成任意其他类型的指针类型。使⽤nullptr定义空指针可以避免类型转换的问题,因为nullptr只能被隐式地转换为指针类型,⽽不能被转换为整数类型。