最近在找工作,在这里总结一下自己遇到的问题,希望能对大家有所帮助!
欢迎讨论!如有错误,欢迎批评指正!
首先是const关键字,直接上代码!
/**
这个工程主要实现const关键字的一些基本用法
*/
#include <iostream>
#include <vector>
using namespace std;
/**
用于fun1的参数可以很大,使用引用传值可以避免参数复制,节省空间,提高速度;
返回值使用引用是同样的道理,并且这时候的返回值是一个左值!
参数使用const代表在函数内部不能改变这个vec,
返回值使用const代表不能通过函数的返回值改变vec!
*/
const vector<int>& fun1(const vector<int> &vec)
{
//不能修改vec中的值!
//返回一个常引用!
//不能将一个局部变量以引用的方式传出!
return vec;
}
void fun2(const int *p)
{
cout << "const" << endl;
}
void fun2(int *p)
{
cout << "not const" << endl;
}
/** 以下重载方式是错误的!使用const为重载提供依据,参数必须是指针或引用!
void fun3(const int n)
{
cout << "const" << endl;
}
void fun3(int n)
{
cout << "not const" << endl;
}
*/
/**
在类A中定义了两个成员函数fun,一个有const关键字,该const表明缺省传入的参数this指针是const的!
A的不同实例中,普通实例将使用无const关键字的fun,const实例将使用有const关键字的fun!
该性质也适用于普通函数,如上面的fun2。(是否只当函数的参数是指针或引用时有效?!)
*/
class A
{
public:
void fun(int i) const { cout << i+1 << endl; }
void fun(int i) { cout << i << endl; }
};
int main()
{
/**1: 使用const声明一个变量,则这个变量不能被改变(最基本的用法),
并且const的对象必须在定义的时候初始化! */
//const int a; 错误,必须初始化!
const int a = 0; //等同于int const a = 0;
//a = 1; 错误,不能改变const对象的值!
/**2: 使用const修饰指针和引用的情况,指针有两种情况,引用有一种情况。*/
int b = 0;
const int *ptr1 = &b; //等同于int const *ptr1 = &b;
++ptr1; //可以进行这个操作,但注意ptr1指向了一个没有意义的地址!
//*ptr1 = 1; 错误,不能改变ptr所指向的对象!这时候const是在类型前面。
int* const ptr2 = &b;
//++ptr2; 错误,不能改变ptr2本身的值!这时候const在*的后面。
*ptr2 = 1;
const int &ref1 = b;
//ref1 = 1; 错误,不能改变ref1所绑定的值!
//int& const ref2 = b; 错误,引用不存在与指针类似的方法,引用一旦绑定就是不可以改变的!
/**3: 关于常引用作为函数的参数和返回值的一些用法(重点)*/
const vector<int> vec1(1000); //定义一个1000大小的int数组
cout << fun1(vec1)[0] << endl; //正确,引用可以作为左值
//fun1(vec1)[0] = 1; 错误,不能修改返回值
/**4: const为函数的重载提供依据(重点)*/
A class1;
class1.fun(1); //输出1
const A class2;
class2.fun(1); //输出2
fun2(ptr1);
fun2(ptr2);
//fun3(a);
//fun3(b);
/**5: 常引用(重点)*/
const string &str = "abc";
//string &str = "acb"; 错误,不能将普通引用绑定到一个常量上面!
return 0;
}