当const出现在函数定义的末尾
#include "stdafx.h" #include <iostream> #include <string> using namespace std; class Person { private: string name; string unit; public: Person(const string& name, const string& unit) { this->name = name; this->unit = unit; } void TryToChange1() const { //this->name = "name1"; //无法编译 没有与这些操作数匹配的 "="运算符 //this->desc = "good guy"; //无法编译,表达式必须是可修改的左值 } const void TryToChange2() { this->name = "IQ"; this->unit = "GSG9"; } void show() { cout << "name: " << name << " unit: " << this->unit << endl; } }; int main(void) { Person* person = new Person("Ash", "ddd"); person->show(); person->TryToChange2(); person->show(); cin.get(); return 0; }
思考:
1.函数末尾加上const,该函数将不能改变类的属性
2.这里没有讨论返回值加上const情况,如const string change()这样的情况,因为说起来其实很简单,就是返回值不能作为左值。
当const修饰形参
#include "stdafx.h" #include <iostream> using namespace std; void change(int num1, int* num2, const int* num3, int* const num4, const int* const num5, const int num6, const int& num7, int &num8) { num1 = 0; num2 = new int(0); num3 = new int(0); *num4 = 0; num8 = 0; //*num3 = 0; //无法通过编译,表达式必须是可修改的左值 //num4 = new int(0); //无法通过编译,表达式必须是可修改的左值 //num5 = new int(5); //无法通过编译,表达式必须是可修改的左值 //*num5 = 0; //无法通过编译,表达式必须是可修改的左值 //num6 = 0; //无法通过编译,表达式必须是可修改的左值 //num7 = 0; //无法通过编译,表达式必须是可修改的左值 } int main(void) { int num1 = 1; int* num2 = new int(2); int* num3 = new int(3); int* num4 = new int(4); int* num5 = new int(5); int num6 = 6; int num7 = 7; int num8 = 8; cout << "入参: num1=" << num1 << " num2=" << *num2 << " num3=" << *num3 << " num4=" << *num4 << " num5=" << *num5 << " num6=" << num6 << " num7=" << num7 << " num8=" << num8 << endl; change(num1, num2, num3, num4, num5, num6, num7, num8); cout << "入参: num1=" << num1 << " num2=" << *num2 << " num3=" << *num3 << " num4=" << *num4 << " num5=" << *num5 << " num6=" << num6 << " num7=" << num7 << " num8=" << num8 << endl; cin.get(); return 0; }
结果
思考:
1.如num6,const修饰的参数,是不可再次赋值的
2.如num2,即使形参是指针,对num2的重新赋值,也不会改变实参的值
除引用传递之外的参数传递方式,如num1和num2的参数传递方式,被称为值传递,根据网上的说法值传递由于存在变量拷贝,因而效率较低;引用传递效率较高,但为了能够避免修改实参,常常以const修饰,另外有时候实际项目中,实参本身就是const类型,所以设计模板函数时,需要考虑到这一情况,支持const引用参数传入
3.如num3,const修饰的是 int* num3,这时num3这个指针的指向是可以改变的,但无法通过num3改变其指向的值。为了理解这一点,可以认为const修饰的是int类型的*num3 ,也就是说*num3是常量
4.如num4,const修饰的是num4这个指针,因此指针的指向不能改变,但指针指向的内容可以改变
5.如const int* const num5 ,num5的指向和指向地址保存的值,都是常量