C++指针、引用、const
- 命名空间
用来处理程序中常见的同名冲突问题。
所谓的命名空间,实际上就是一个有程序设计者命名的内存区域。
除了用户可以声明自己的 命名空间外,C++还定义了一个标准的命名空间std。
方法有两种:
- 在源文件中使用"using namespace std"语句。
using指令告诉编辑器:如果没有特别指明,下面出现的名字将尝试在指定的名字空间找。
例如:
#include<iostream>
using namespace std;
int main()
{
cout<<“Welcome!”<<endl;
return 0;
}
2. 在该标识符前面加上
命名空间及作用域运算符“::”
。
例如:
#include<iostream>
int main()
{
std::cout<<“Welcome!”<<std::endl;
return 0;
}
- C++基本的输入输出流
- cout是标准输出流对象,<< 是输出操作符;
- cin是标准输入流对象,>>是输入操作符;
- endl是换行操作符;
它们都属于C++标准库,所以都在std的名字空间里面。
- 重载(C++为什么支持重载?)
函数重载便于记忆,提高了函数的易用性。
类的构造函数需要重载机制,C++规定构造函数必须与类名相同,因此只能又有一个名字。如果想用几种不同的方法来创建对象,只能用重载机制来实现。
函数重载
:在同一作用域类,一组函数的函数名相同,参数列表不同(个数不同/类型不
同),返回值可同可不同。
- C++缺省参数
所谓缺省参数,顾名思义,就是在声明函数的某个参数的时候为之指定一个默认值,在调用该函数的时候如果采用该默认值,你就无须指定该参数。缺省参数使用主要规则: 调用时你只能从最后一个参数开始进行省略。声明是带有缺省参数的函数,则缺省值只能写在声明当中。
//全缺省
int Dev1(int a=0, int b=0)
{
return a-b;
}
//半缺省
int Dev2(int a, int b=0)
{
return a-b;
}
void test()
{
dev1();
dev1(5);
dev1(8,2);
dev2(2);
dev2(9,3);
}
- 指针和引用
引用
格式为:
类型 & 引用名 = 某变量名;
int i = 5;
int& j = i;//j引用了i,j的类型是
int&
某个变量的引用,等价于这个变量,相当于该变量的一个别名。
int n = 7;
int & r = n;
r = 4;
cout<< r; //输出4
cout<<n; //输出4
n = 5;
cout<< r; //输出5
注意:
- 定义引用时一定要将其初始化成引用某个变量。
- 初始化后,它就一直引用该变量,不会再引用别的变量了。
- 引用只能引用变量,不能引用常量和表达式。
引用的示例:
double a=4, b=5;
double & r1 = a;
double & r2 = r1; //r2也引用了a
r2 = 10;
cout<<a<<endl; //输出10
r1 = b; //r1并没有引用b
cout<<a<<endl; //输出5
用指针实现两个数的交换:
void swap(int* a, int* b)
{
int tmp = *a;
*b = *a;
tmp = *b;
}
int n1,n2;
swap(&n1, &n2); //n1, n2的值被交换
有了C++的引用:
void swap(int& a, int& b)
{
int tmp = a;
b = a;
tmp = b;
}
int n1,n2;
swap(n1, n2); //n1, n2的值被交换
引用作为函数返回值
int n = 4;
int& SetValue( )
{
return n;cyiny
}
int main( )
{
SetValue( ) = 40;
cout<< n;
return 0;
}
//输出:40
常引用
定义引用时,前面加const关键字,即为“常引用”。
int n = 1;
const int& r = n;
r 的类型是 const int&
常引用的特点:
不能通过常引用去修改其引用的内容
int n = 100;
const int& r = n;
r = 200; //编译出错
n = 300;//ok
const T & 和 T & 是不同的类型!!!
T & 类型的引用或T 类型的变量可以用来初始化 const T & 类型的引用。
const T 类型的常变量和const T & 类型的引用则不能用来初始化T & 类型的引用,除非进行
强制类型转换。
const关键字的用法:
- 定义常量
- 定义常量指针
不可通过常量指针修改其指向的内容
int n ,m ;
const int* p = &n;
*p = 5;//编译出错
n = 4;//Ok
p = &m;//OK,常量指针的指向可以变化
不能把常量指针赋值给非常量指针,反过来可以
const int* p1;
int* p2;
p1 = p2;//ok
p2 = p1;//error
p2 = (int*) p1;//ok,强制类型转换
函数参数为常量指针时,可避免函数内部不小心改变参数指针所指的内容
void MyPrintf(const char* p)
{
strcpy(p, "this");//编译错
printf("%s", p);//ok
}
- 定义常引用
引用的示例: