• C++入门--常成员函数


    1.作用:无法修改数据成员,一般用来修饰Get的函数

    2.本质:this指针类型:const T* const

    3.意义:让编译器提醒开发者该函数不能修改类的成员变量,用于const对象(引用或指针)

    看一个例子:

     1 #include <iostream>
     2 #include <string>
     3 using namespace std;
     4 
     5 class CInterger {
     6    public:
     7     CInterger(int nNumber) { m_nNumber = nNumber; }
     8     int GetNumber();
     9     void SetNumber(int nNumber) { m_nNumber = nNumber; };
    10 
    11    private:
    12     int m_nNumber;
    13 };
    14 
    15 int CInterger::GetNumber() { return m_nNumber; }
    16 
    17 int main(int argc, char const *argv[]) {
    18     CInterger i = 1;
    19     return 0;
    20 }

    在C++中,语法比较自由,可以在程序运行时利用指针改变程序任意处的内容

    以上中,可知get方法只是获取成员变量,故不允许人为修改

    使用常成员函数:

     1 #include <iostream>
     2 #include <string>
     3 using namespace std;
     4 
     5 class CInterger {
     6    public:
     7     CInterger(int nNumber) { m_nNumber = nNumber; }
     8     int GetNumber() const;  //常成员函数
     9     void SetNumber(int nNumber) { m_nNumber = nNumber; };
    10 
    11    private:
    12     int m_nNumber;
    13 };
    14 
    15 int CInterger::GetNumber() const {
    16     // m_nNumber = 1;   Error:expression must be a modifiable lvalue
    17     return m_nNumber; 
    18      }
    19 
    20 int main(int argc, char const *argv[]) {
    21     CInterger i = 1;
    22     return 0;
    23 }

    const 常成员函数

      1.普通的类成员函数this指针类型: T*  const(表示该指针本身不能被修改)T为该类

        例如:SetNumber()的this指针类型为:CInterger* const;

      2.常成员函数this指针类型:const T* const

        1)表示该指针本身不能被修改

        2)表示指针指向的内容不能被修改

              this指针指向对象,所以常成员函数this指向的内容(成员变量)不能被修改

    如何非的在常成员函数内修改成员变量?

      将类中的成员变量声明为mutable;

    ...
    private:
        mutable int m_nNumber;

    const常成员变量

     1 class CInterger {
     2    public:
     3     CInterger(int nNumber) { m_nNumber = nNumber; }
     4     int GetNumber() const;
     5     void SetNumber(int nNumber) { m_nNumber = nNumber; };
     6 
     7    private:
     8     int m_nNumber;
     9     const int m_nTest;   //error: uninitialized const member in ‘const int
    10 };

    常成员变量在定义的时候要初始化,因为其定义后不允许被修改。

    const  int m_nTest = 1;

    但是对于一些版本较低的编译器,不允许定义时初始化,所以可以用初始化列表的方式来初始化。

    在构造函数后

        CInterger(int nNumber) : m_nTest(1),m_nNumber(2) { m_nNumber = nNumber; }

    初始化列表:

    1、可以用来初始化普通成员变量/常成员变量

    2、通常用来构造有参数的成员对象

     1 #include <iostream>
     2 #include <string>
     3 using namespace std;
     4 
     5 class CTest {
     6    public:
     7     CTest(int m, int n) {
     8         m_n = n;
     9         m_m = m;
    10     }
    11    private:
    12     int m_n;
    13     int m_m;
    14 };
    15 
    16 class CInterger {
    17    public:
    18     CInterger(int nNumber) : m_nTest(1), m_nNumber(2),t(22,33) { m_nNumber = nNumber; }
    19     void SetNumber(int nNumber) { m_nNumber = nNumber; };
    20 
    21    private:
    22    CTest t;
    23     int m_nNumber;
    24     const int m_nTest;
    25 };
    26 
    27 int main(int argc, char const *argv[]) {
    28     CInterger i = 1;
    29     return 0;
    30 }
  • 相关阅读:
    C#中的String.Length获取中文字符串长度出错
    PHP+Jquery+Ajax实现checkbox多选删除功能
    WIndows下AppAche服务中调试php页面出现警告:Call to undefined function mysql_connect()
    简洁的SQL一条语句更新从属账号
    算法导论数论一般离散对数问题
    Poj 2115
    算法导论数论计算x^2=1(mod n) 在区间[1,n1]的解
    算法导论数论RSA公钥加密系统
    算法导论数论中国余数定理
    Poj 2891 中国剩余定理 非互素
  • 原文地址:https://www.cnblogs.com/y4247464/p/13822275.html
Copyright © 2020-2023  润新知