程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 不可或缺 Windows Native (18),native18

不可或缺 Windows Native (18),native18

編輯:C++入門知識

不可或缺 Windows Native (18),native18


[源碼下載]


不可或缺 Windows Native (18) - C++: this 指針, 對象數組, 對象和指針, const 對象,  const 指針和指向 const 對象的指針, const 對象的引用



作者:webabcd


介紹
不可或缺 Windows Native 之 C++

  • this 指針
  • 對象數組
  • 對象和指針
  • const 對象
  • const 指針和指向 const 對象的指針
  • const 對象的引用



示例
1、CppEmployee 類
CppEmployee.h

#pragma once 

#include <string>

using namespace std;

namespace NativeDll
{
    class CppEmployee
    {

        int Number; // 默認為 private

    private: // 以下都是 private 的
        string Name;
        bool IsMale;

    protected: // 以下都是 protected 的
        string ToString();

    public: // 以下都是 public 的
        float Salary;
        int Age;
        string Show();

        // 構造函數(constructor),不定義的話,編譯時會自動生成一個默認的不做任何事情的無參數構造函數(如果指定為 private 的話就可以禁止直接實例化,一般做單例模式的話會這麼做)
        // 另外:如果聲明了帶參數的構造函數,則不會自動生成默認的無參數構造函數
        CppEmployee();
        CppEmployee(int number, string name = "webabcd"); // 可以為構造函數中的參數指定默認值(參考:CppFunction1.cpp)
        CppEmployee(int number, string name, bool isMale);

        // 析構函數(destructor),對象被銷毀時會調用,例如釋放動態分配的內存等。不需要時也可以不定義,編譯時會自動生成一個默認的不做任何事情的析構函數,析構函數的函數名與類名相同,前面有“~”
        ~CppEmployee();

    private:
        // 注:在體內定義的成員函數,系統會自動將其作為 inline 函數處理(關於 inline 函數,參見:CppFunction2.cpp)
        void Temp()
        {
            int a = 100;
        }

        /*
        下面這個與上面那個一樣
        inline void Temp()
        {
            int a = 100;
        }
        */

    };
}

CppEmployee.cpp

/*
 * CppEmployee 類
 */

#include "pch.h" 
#include "CppEmployee.h" 
#include "cppHelper.h"

using namespace NativeDll;

// “::”是作用域限定符(field qualifier)
string CppEmployee::Show()
{
    return int2string(Number) + " " + Name;
}

string CppEmployee::ToString()
{
    return int2string(Number) + " " + Name;
}

// 無參數的構造函數
CppEmployee::CppEmployee()
{
    Number = 888;
    Name = "webabcd";
}

// 有參數的構造函數,可以在聲明中為參數指定默認值
CppEmployee::CppEmployee(int number, string name)
{
    Number = number;
    Name = name;
}

// 可以通過下面這種簡單的方式,將構造函數中的參數值賦值給對象的變量
CppEmployee::CppEmployee(int number, string name, bool isMale) :Number(number), Name(name), IsMale(isMale)
{

}

CppEmployee::~CppEmployee()
{

}


2、演示 this 指針, 對象數組, 對象和指針, const 對象,  const 指針和指向 const 對象的指針, const 對象的引用
CppClass2.h

#pragma once 

#include <string>

using namespace std;

namespace NativeDll
{
    class CppClass2
    {
    private:
        string Name;

    public:
        string Demo();
    };
}

CppClass2.cpp

/*
 * this 指針, 對象數組, 對象和指針, const 對象,  const 指針和指向 const 對象的指針, const 對象的引用
 */

#include "pch.h" 
#include "CppClass2.h" 
#include "CppEmployee.h" 

using namespace NativeDll;

void cppclass2_demo1();
void cppclass2_demo2();
void cppclass2_demo3();
void cppclass2_demo4();
void cppclass2_demo5();

string CppClass2::Demo()
{
    // 什麼是 this 指針:
    // 在每一個成員函數中都包含一個特殊的指針,即 this 指針。它是指向本類對象的指針,它的值是當前被調用的成員函數所在的對象的起始地址
    this->Name = "abc";
    string name = (*this).Name;


    // 對象數組
    cppclass2_demo1();

    // 對象和指針
    cppclass2_demo2();

    // const 對象
    cppclass2_demo3();

    // const 指針和指向 const 對象的指針
    cppclass2_demo4();

    // const 對象的引用
    cppclass2_demo5();


    return "看代碼及注釋吧";
}



// 對象數組
void cppclass2_demo1()
{
    // 對象數組
    CppEmployee employees[3] =
    {
        CppEmployee(1, "name1"),
        CppEmployee(2, "name2"),
        CppEmployee(3, "name3")
    };

    // 數組名 employees 就是該數組的首地址
    employees->Show(); // 1 name1
}



// 對象和指針
void cppclass2_demo2()
{
    CppEmployee employee(1, "webabcd"); 


    // 指向對象的指針
    CppEmployee *p1 = &employee;
    p1->Salary = 1000;


    // 指向對象中的指定屬性的指針
    float *p2 = &employee.Salary; // . 的優先級高


    // 函數指針(指向函數的指針)
    string (CppEmployee::*p3)(); // 定義一個函數指針。此函數為 CppEmployee 類中的一個 public 函數,其無參數,返回值為 string 類型
    p3 = &CppEmployee::Show; // 使 p3 指向 CppEmployee 類中的 public 函數 Show
    string result = (employee.*p3)(); // 調用對象 employee 中 p3 所指的函數

    string(CppEmployee::*p4)() = &CppEmployee::Show;
    result = (employee.*p4)(); // 1 webabcd
}



namespace NativeDll
{
    class CppEmployeeConst
    {

    public: 
        float Salary;
        int Age;
        mutable int Num; // mutable 屬性,即使對象是 const 對象的話,也可以設置其 mutable 屬性
        const string Name; // const 數據成員
        const boolean IsMale; // const 數據成員

        string Show() const // const 成員函數(注意 const 寫在後面)
        {
            // const 函數不能調用非 const 函數
            // return this->ToString();

            return "abc";
        }

        string ToString()
        {
            return "abc";
        }

        // 必須提供一個構造函數,用以初始化所有 const 數據成員
        CppEmployeeConst(string name) :Name(name), IsMale(true)
        { 
            this->Age = 35;
        }
    };
}

// const 對象
void cppclass2_demo3()
{
    // 實例化一個非 const 對象
    CppEmployeeConst employee("webabcd");
    // 不能修改對象中的 const 屬性
    // employee.IsMale = true;



    // 實例化一個 const 對象
    // CppEmployeeConst const employeeConst;
    const CppEmployeeConst employeeConst("webabcd");

    // 可以獲取 const 對象中的 const 屬性和非 const 屬性
    string name = employee.Name;
    int age = employee.Age;

    // 不能設置 const 對象中的 const 屬性和非 const 屬性
    // employee.Salary = 100;
    // employee.Name = "wanglei";

    // 可以設置 const 對象中的 mutable 屬性
    employee.Num = 88;

    // 可以調用 const 對象中的 const 函數,不能調用非 const 函數
    employee.Show();
    // employee.ToString();
}



// const 指針和指向 const 對象的指針
void cppclass2_demo4()
{
    CppEmployee employee(1, "webabcd");
    CppEmployee employee2(1, "webabcd");


    // const 指針:指針始終指向同一個對象(指針是 const 的)
    CppEmployee *const p1 = &employee;
    // p1 = &employee2; // 編譯錯誤,因為指針是 const 的,不能對其賦值


    // 指向 const 對象的指針(所指的對象是 const 的)
    const CppEmployee *p2 = &employee;
    // p2->Salary = 100; // 編譯錯誤,因為所指的對象是 const 的,不能對其屬性賦值


    // 當使用指針的方式傳參時,如果不希望在函數中修改其所指的對象,則可以這麼做
    void cppclass2_function1(const CppEmployee *p);
    cppclass2_function1(&employee);
}

void cppclass2_function1(const CppEmployee *p)
{
    // 不能在此函數中修改 p 所指對象
    // p->Salary = 100;
}



// const 對象的引用
void cppclass2_demo5()
{
    CppEmployee employee(1, "webabcd");
    CppEmployee employee2(1, "webabcd");


    // const 對象的引用(被引用的對象是 const 的)
    const CppEmployee &r = employee;
    // r.Salary = 100; // 編譯錯誤,因為被引用的對象是 const 的,不能對其屬性賦值


    // 當使用引用的方式傳參時,如果不希望在函數中修改其引用的對象,則可以這麼做
    void cppclass2_function2(const CppEmployee &r);
    cppclass2_function2(r);
    cppclass2_function2(employee);
}

void cppclass2_function2(const CppEmployee &r)
{
    // 不能在此函數中修改 r 所引用的對象
    // r.Salary = 100;
}



OK
[源碼下載]

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved