【03】指针、返回值、成员函数的const

  1 //
  2 // 2015-03-05 03/55
  3 // 指针、返回值、成员函数 之 const
  4 //
  5
  6 #include <iostream>
  7 #include <string>
  8
  9 using namespace std;
 10
 11 // ------------------------------
 12 //      1. 指针的const
 13 // ------------------------------
 14 const char *p1       = "Hello"; // p 指向的是常量
 15 char* const p2       = "Hello"; // p 本身是常量
 16 const char* const p3 = "Hello"; // p 本身是常量,指向的也是常量
 17
 18 // ------------------------------
 19 //      2. 返回值的const
 20 // ------------------------------
 21 string foo()
 22 {
 23     return "Hello";
 24 }
 25
 26 int main(int argc, char *argv[])
 27 {
 28     // 以下这是合法的,将 foo 的声明改为 const string foo()
 29     // 则不再合法,将返回声明为const可以避免‘==‘误写为‘=‘。
 30     foo() = "abc";
 31     return 0;
 32 }
 33
 34 // ------------------------------
 35 //      3. 成员函数的const
 36 // ------------------------------
 37 class bar
 38 {
 39 public:
 40     void func()
 41     { cout << "non-const func is called"; }
 42
 43     void func() const
 44     { cout << "the const func is called"; }
 45
 46     // 成员函数 const 属性可以构成重载的,我们知道非静态成员函数都隐含 this 指针,
 47     // 所有 const 与 non-const 成员函数可以理解为下面的声明:
 48     // void func(bar *this);        (1)
 49     // void func(const bar *this);  (2)
 50     // 一个 non-const 对象,可以调用 (1) & (2),const 对象只能调用 (2)。
 51 };
 52
 53 int main(int argc, char *argv[])
 54 {
 55     // this 是 bar* 类型,可以赋值给 const 没问题,
 56     // 按照 non-const -- const 匹配调用,如果没有
 57     // 定义 non-const 版本,那么可以调用 const 的。
 58     bar b;
 59     b.func();
 60
 61     // 只能调用 const 版本,this 是 const bar* 类型。
 62     const bar cb;
 63     cb.func();
 64 }
 65
 66 // ----------------------------------------------
 67 //      4. 成员函数因const重载而引起的代码冗余
 68 // ----------------------------------------------
 69 class TextBlock
 70 {
 71 public:
 72     TextBlock() : text("Hello")
 73     {}
 74
 75     // const 版本
 76     const char& operator[](const size_t pos) const
 77     {
 78         cout << "the const operator[] is called" << endl;
 79         return text[pos];
 80     }
 81
 82     // non-const 版本可以调用 const 版本
 83     char& operator[](const size_t pos)
 84     {
 85         cout << "non-const operator[] is called" << endl;
 86         return const_cast<char&>(
 87             static_cast<const TextBlock&>(*this)[pos]
 88             );
 89     }
 90 private:
 91     string text;
 92 };
 93
 94 int main(int argc, char *argv[])
 95 {
 96     TextBlock tb;
 97     tb[1] = ‘J‘; // OK call non-const
 98
 99     const TextBlock ctb;
100     cout << ctb[1] << endl;
101
102     // Error 返回类型是 const 的引用,不能赋值。
103     // 其实如果只是返回简单变量 char f(),也不能赋值。
104     ctb[1] = ‘H‘;
105 }
106
107 // ----------------------------------------------
108 //      5. mutable 的使用
109 // ----------------------------------------------
110 class TextBlock
111 {
112 public:
113     TextBlock() : text("Hello"), lengthValid(false)
114     {}
115
116     size_t length() const   // 这里size_t是简单类型,返回不用设置const即可。
117     {
118         if (!lengthValid)
119         {
120             textLength = strlen(text);
121             lengthValid = true;
122         }
123         return textLength;
124     }
125 private:
126     char   *text;
127     mutable bool   lengthValid;
128     mutable size_t textLength;
129 };
时间: 2024-10-24 06:51:55

【03】指针、返回值、成员函数的const的相关文章

函数指针,函数指针数组,函数返回值为函数指针

函数的名字就是函数的首地址:定义函数指针; int (*p)(int ) p为函数指针变量名字,int 为函数的返回值类型为int型:(int)为函数的形参类型为int型, 注:因为优先级所以要用(*p),否则就会p先和后面的()结合为int*p(int),意思就变为p(int)函数的返回值为int* 注:main2()函数中   int (*p[])(int ,int )  为一维数组,下面写错了, #include<stdio.h> #include<stdlib.h> int

C++ Primer 学习笔记_24_类与数据抽象(10)--static 与单例模式、auto_ptr与单例模式、const成员函数、const 对象、mutable修饰符

C++ Primer 学习笔记_24_类与数据抽象(10)--static 与单例模式.auto_ptr与单例模式.const成员函数.const 对象.mutable修饰符 前言 [例]写出面向对象的五个基本原则? 解答:单一职责原则,开放封闭原则,依赖倒置原则,接口隔离原则和里氏替换原则 里氏替换原则:子类型必须能够替换他们的基类型. 设计模式分为三种类型:创建型模式.结构型模式和行为型模式 一.static 与单例模式 1.单例模式 单例模式的意图:保证一个类仅有一个实例,并提供一个访问它

python--函数的返回值、函数参数的使用、名称空间与作用域、函数嵌套、函数对象

今天学习内容有函数的返回值.函数参数的使用.名称空间与作用域.函数嵌套. 下来我们一一查看. 函数的返回值 看几个栗子: def func(x): return x**2 y=func(10) print(y) def foo(): return None res=foo() print(res) def foo(): return{'a':1} res=foo() print(res['a']) def foo(): return {'a':1},1,'a',[1,2] res=foo() p

#返回值包含函数

#返回值包含函数 def bar(): print('from bar') def foo(): print('from foo') return bar n = foo() n()

速战速决 (3) - PHP: 函数基础, 函数参数, 函数返回值, 可变函数, 匿名函数, 闭包函数, 回调函数

[源码下载] 作者:webabcd 介绍速战速决 之 PHP 函数基础 函数参数 函数返回值 可变函数 匿名函数 闭包函数 回调函数 示例1.函数的相关知识点 1(基础)function/function1.php <?php /** * 函数的相关知识点 1(基础) */ // 可以在相关的 function 声明语句之前调用该函数 f1(); function f1() { echo "f1"; echo "<br />"; } // 这里调用

使用在类中定义的有返回值的函数,如何得到执行结果反馈?

我们做开发时,程序执行完后最好会有个反馈结果,尤其是在庞大的程序中,如果有bug可以及时发现,不然很浪费时间...最近做sde的二次开发,创建数据集时要用到带有返回值的函数,因为在数据集上创建要素类需要用到这个数据集,声明一个全局变量,可以直接用这个返回值.但是在捕获错误方面受到了限制,因为有返回值的函数每一个节点都要有返回值,想直接得到反馈是不行的,想在方法执行后写结果反馈的代码是检测不到的. 只能向师傅求救,给我提供了两种方法解决,感觉很巧妙. 原来的代码: Form1中的代码: priva

记得适当的声明成员函数为const.

如果确信一个成员函数不用修改它的对象,就可以声明它为const,这样就可以作用于他的const对象了.因为const对象只能调用它的const方法. 1 template<class T> class Vector 2 { 3 public: 4 int length() const//如果这里没有const,那么该程序会运行失败,因为padded_length的方法中的参数是const的. 5 { 6 return 2; 7 }; 8 int length(int); 9 }; 10 tem

函数深入理解---返回值为函数

返回值为函数 function fn1(arg){ //此时返回的是一个函数对象 var rel = function(num){ return arg + num; } return rel; //直接返回一个可以调用的函数 } //此时f是一个函数对象,可以完成调用 var f = fn1(20); console.log(f(20)); console.log(f(11)); ps.sort(sortByProperty('age')); function sortByProperty(p

Swift2.0语言教程之函数的返回值与函数类型

Swift2.0语言教程之函数的返回值与函数类型 Swift2.0中函数的返回值 根据是否具有返回值,函数可以分为无返回值函数和有返回值函数.以下将会对这两种函数类型进行讲解. Swift2.0中具有一个返回值的函数 开发者希望在函数中返回某一数据类型的值,必须要在函数声明定义时为函数设定一个返回的数据类型,并使用return语句进行返回.其中,return语句的一般表示形式如下: return 表达式 其中,表达式可以是符合Swift标准的任意表达式.而具有返回值的函数声明定义形式如下: fu