ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

const理解

const理解 旨在深入理解const。Person a(“张三”);Person b(“李四”);const Person* p; const 在*左边const修饰【*p】保护指向的对象对象不能改指针p本身可以改可以换指向别的对象const修饰【*p】只能调用Person的常函数constPerson*p1a;couttypeid(p1).name()endl;//p1-setName(修改名字);//error C2662: “void Person::setName(const std::string )”: 不能将“this”指针从“const Person”转换为“Person ”p1-getName();//p1-printMutable();p1b;//p1 指针的值可以被修改//p1-setName(修改名字);//指向的对象对象不能改p1-print();Person* const p2; const 在*右边const修饰指针变量p2指针p2本身不能改不能换指向但是指向的对象内容可以修改Person*constp2a;p2-print();p2-setName(张三改名字);// ✅合法可以修改对象内容p2-print();//p2 b; // ❌编译报错指针p2本身不能改变指向不能再指向b//error C3892: “p2”: 不能给常量赋值const Person* const p3; 两边都const对象不能改指针本身也不能改双重保护constPerson*constp3a;//p3-setName(xxx); // ❌报错不能修改对象//error C2662: “void Person::setName(const std::string )”: 不能将“this”指针从“const Person”转换为“Person ”//p3 b; // ❌报错不能修改指针指向//error C3892 : “p3” : 不能给常量赋值p3-print();// ✅const成员函数可以调用Person* p4; 完全无constPerson*p4a;p4-setName(随便改);// ✅修改对象p4b;// ✅修改指针指向p4-print();对比引用 const Person 高频constPersonrefa;//ref.setName(123); // ❌不能修改对象引用绑定的对象只读//error C2662: “void Person::setName(const std::string )”: 不能将“this”指针从“const Person”转换为“Person ”ref.print();//ref b;// error C2678: 二进制“”: 没有找到接受“const Person”类型的左操作数的运算符(或没有可接受的转换)此处执行的是赋值拷贝运算操作。因为该函数为非常函数ref作为常引用没法调用非常函数所以不能执行。// 引用没有“修改指向”这个说法引用一旦绑定永远绑定a不能重新绑定别的对象Personref1a;ref1.setName(修改引用);ref1b;//此处执行的是拷贝赋值操作不是引用指向变了不是ref1指向b了。相当于执行了 a b//**引用一旦绑定永远不能换目标**没有 “重新绑定”不存在r xxx改变引用指向rxxx是赋值给原对象。//ref b;// error C2678: 二进制“”: 没有找到接受“const Person”类型的左操作数的运算符(或没有可接受的转换)此处执行的是赋值拷贝运算操作。因为该函数为非常函数ref作为常引用没法调用非常函数所以不能执行。ref1 b; //此处执行的是拷贝赋值操作不是引用指向变了不是ref1指向b了。相当于执行了 a b。
返回列表