C++对C语言的扩充
命名空间
目的:为了解决C++中命名冲突的问题。 比如,当自定义了两个函数的函数名相同、自定义的函数的函数名与标准库中函数的函数名相同时,为了区分,C++引入了命名空间进行标识。
标准命名空间
using namespace std;
std为C++的标准命名空间
自定义命名空间
在C++中,我们可以用namespace关键字自定义命名空间。比如:
namespace sp
{
void function(){}
}
其中,我们自定义了一个名为sp的命名空间,在这个命名空间中,有一个function()函数。
使用命名空间定义元素
(1)直接引用
using namespace std;
(2)间接引用
using std::cout;
cout<<"Hello,world";
(3)命名空间::元素
例如输出数据时:
std::cout<<"Hello,world"<<std::endl;
匿名命名空间
匿名命名空间在创建时不写名字,由系统自动分配。但是,匿名命名空间的内容只能被当前源文件使用,其它源文件不能使用。
输入输出
在C++中,输入输出都是用“流”(stream)实现的。
基本语法
1.cin
与“>>”结合使用,用于输入信息。
//输入单个数据
int a,b;
cin>>a;
cin>>b;
//输入多个数据
int a,b;
cin>>a>>b;
2.cout
与“<<”结合,用于输出信息。
//输出常量
cout<<"Hello,world"<<endl;
cout<<'w'<<endl;
//输出单个变量
int c=200;
cout<<c<<endl;
//输出多个变量
int f=100;
int g=50;
cout<<g<<"步笑"<<f<<"步"<<endl;
其中,endl为换行符。
默认参数
#include<iostream>
using namespace std;
void function(int a,int b=20,int c=30){
cout<<a*b*c<<endl;
}
int main(){
function(2);//只传递2给a,其它都默认用形参
function(2,3);//传递2给a,3给b,默认用形参
function(1,2,3);//传递1给a,2给b,3给c
return 0;
}
使用规则
1.默认参数是从右向左进行赋值。也就是说,如果有一个参数设定了默认参数,其右边不能存在未赋值的形参。
2.默认参数在参数传入时,会从左向右进行参数的匹配。
3.默认参数只能在函数声明中出现一次。
函数重载(overload)
功能:用来实现功能类似而所处理的数据类型不同的问题。也就是说,函数重载是在同一个作用域内函数名相同,但是实现功能不同(参数个数或者参数类型不同)的函数。
例如以下三个重载函数:
void mult(int a,int b);
void mult(float a,float b);
void mult(double a,int b, float c);
注意:
当重载函数的形参中有默认参数时,应避免产生调用的二义性,例如:
void mult(int a,int b=1);
void mult(int a);
此时调用mult函数时,便会产生调用的二义性。因此在编写重载函数时,不要写带有默认参数的重载函数。
引用
定义格式
数据类型& 引用名 = 变量名
其中,符号“&”只起到标识的作用。
用法
#include<iostream>
using namespace std;
int main(){
int a=100;
int& b=a;
cout<<"a的地址:"<<hex<<&a<<endl;
cout<<"b的地址:"<<hex<<&b<<endl;
cout<<"b的值:"<<b<<endl;
return 0;
}
其中a的地址与引用b的地址相同,b与a的值相同,也就是说,引用只是给变量换了一个名字。
注意事项
1.引用在定义时必须初始化,并且变量类型要保持一致。
2.常量不能被引用。例如int& b=200是不可行的。
3.引用在初始化后,其值不能再更改。
引用和指针的区别
引用 | 指针 |
---|---|
不需要占据额外的存储单元 | 需要额外占据存储单元 |
作为函数参数时,实参是变量的地址 | 作为函数参数时,实参是变量本身 |
不可以为空 | 可以为空 |
被创建时被初始化 | 可以在任何时候被初始化 |
在初始化后不可以改变 | 初始化后可以改变,既指向其它的存储单元 |
字符串类
字符串的定义
string a1;
a1="hello,world";//第一种
//------------------
string a2="hello,world";//第二种
string a3=("hello,world");//第三种
string a4(6,'b');//第四种,输出6个b
字符串的操作
1.访问字符串
//将第一个和第三个b改为c
string a="bbbbbb";
a[0]='c';
b[2]='c';
2.字符串的连接
string a,b;
a="hello,";
b="world";
cout<<a+b<<endl;//输出hello,world
3.字符串的比较
//比较a1和a2的长度
string a1,a2;
cin>>a1>>a2;
if(a1>a2){
cout<<a1的长度大于a2<<endl;
}
else(a2>a1){
cout<<a2的长度大于a1<<endl;
}
4.字符串长度的计算
string a="hello,world";
cout<<"a的长度为:"<<a.length()<<endl;
5.字符串的交换
string a1="hello,";
string a2="world";
a1.swap(a2);//第一种方式
swap(a1,a2);//第二种方式
分配/释放内存
new分配堆内存
格式
new 数据类型(初始化列表);
其中,数据类型为申请的内存空间中,储存的数据的类型;初始化列表为储存的数据。
new和malloc的区别
new | malloc | |
---|---|---|
属性 | 编译器支持 | 头文件支持 |
参数 | 无需指定内存块大小 | 需要指出所需内存的大小 |
返回类型 | 返回对象类型的指针 | void* |
分配失败 | 抛出bac_alloc异常 | 返回NULL |
重载 | 允许重载 | 不允许重载 |
内存区域 | 自由存储区上为对象动态分配内存空间 | 从堆上动态分配内存 |
new的用法
(1)创建基本数据类型对象
int* a=new int(100);//存储int类型的数据
int* b=new float();//存储float类型的数据,初始化列表为空,默认0初始化对象
char* c=new char;//存储char类型的数据
(2)创建数组类型对象
new 数据类型[数组长度];
char* a=new char[20];//创建长度为20的字符串
delete释放堆内存
格式
delete 指针名;
释放数组对象
delete []指针名;