c语言入门到c++使用高手:深入学习C++之类 (一)

第三章 类

第一节 成员函数,对象拷贝,私有成员

1. 综述

  • 类是我们自己定义的数据类型(新类型)

  • 设计类时要考虑的角度

  1. 站在设计和实现者的角度来考虑

  2. 站在使用者的角度来考虑

  3. 父类,子类

2. 类基础

  • 一个类就是用户自己定义的数据类型,把类想像成命名空间,包着一堆东西(成员函数,成员变量)

  • 一个类的构成:成员变量,成员函数(有许多特殊成员函数,后续慢慢讲解)

  • 访问类成员时,如果是类对象,我们就使用对象名.成员名来访问成员,
    如果是指向对象的指针,我们使用指针名->成员名来访问成员

  • public成员提供对外的接口,暴露给外界,提供外界调用,
    private成员提供各种实现类功能的细节方法,但不暴露给使用者,外界无法使用这些成员

  • struct是成员默认为public的class, struct A {};class成员默认是私有的,class A{};
    ==> struct A{} 等价于 class A{public:}

#include <iostream>

using namespace std;
class student{
public:
    int num;
};

int main() {


    student someone;//定义类
    someone.num =100;
    cout << someone.num << endl;

    student *pstu;
    pstu = &someone;
    pstu->num = 88;
    cout <<  pstu->num << endl;

    return 0;
}

3. 成员函数

完整范例

  • Time.h
//
// Created by felaim on 2020/5/26.
//

#ifndef LESSION_PART_TWO_TIME_H
#define LESSION_PART_TWO_TIME_H

class Time {
public:
    int Hour;
    int Minute;
    int Second;

    void initTime(int tmphour, int tmpmin, int tmpsec);
};

#endif //LESSION_PART_TWO_TIME_H

  • Time.cpp
//
// Created by felaim on 2020/5/26.
//
#include "Time.h"

// 成员函数initTime的实现
// ::叫做作用域运算符,表示initTime属于Time类
void Time::initTime(int tmphour, int tmpmin, int tmpsec) {
    //成员函数中可以直接使用成员变量名
    // 哪个对象调用的成员函数,这些成员变量就属于对应的对象
    Hour = tmphour;
    Minute = tmpmin;
    Second = tmpsec;
}

  • main.cpp
#include <iostream>
#include "Time.h"

using namespace std;

int main() {
    Time mytime;
    mytime.initTime(11, 14, 45);
    //mytime: 11:14:45
    cout << "mytime: " << mytime.Hour << ":" << mytime.Minute << ":" << mytime.Second << endl;

    return 0;
}
  • CMakeLists.txt
cmake_minimum_required(VERSION 3.14)
project(lession_part_two)

set(CMAKE_CXX_STANDARD 11)
include_directories(./include/)
add_executable(lession_part_two main.cpp ./source/Time.cpp)

4. 对象的拷贝

  • 对象是可以拷贝的,默认情况下,这种类对象的拷贝,是每个成员变量逐个拷贝

  • 如果在Time类中我们要定义适当的"赋值运算符",就能够控制对象的这种拷贝

#include <iostream>
#include "Time.h"

using namespace std;

int main() {
    Time myTime;
    myTime.initTime(11, 14, 45);
    //mytime: 11:14:45
    cout << "myTime: " << myTime.Hour << ":" << myTime.Minute << ":" << myTime.Second << endl;

    // 对象拷贝,断点查看时内存地址不一样
    Time myTime0 = myTime;
    Time myTime1{myTime};
    Time myTime2(myTime);
    Time myTime3 = {myTime};
    myTime3.Hour = 12;
    cout << "myTime: " << myTime.Hour << ":" << myTime.Minute << ":" << myTime.Second << endl;
    cout << "myTime3: " << myTime3.Hour << ":" << myTime3.Minute << ":" << myTime3.Second << endl;
    
    return 0;
}

5. 私有成员

  • Time.h
//
// Created by felaim on 2020/5/26.
//

#ifndef LESSION_PART_TWO_TIME_H
#define LESSION_PART_TWO_TIME_H

class Time {
private:
    // 私有成员变量不能在外部直接用成员变量名使用
    // 可以自己的成员函数调用
    int Millisecond;//毫秒
    void initMillTime(int mls);

public:
    int Hour;
    int Minute;
    int Second;

    void initTime(int tmphour, int tmpmin, int tmpsec);

};

#endif //LESSION_PART_TWO_TIME_H

-Time.cpp

//
// Created by felaim on 2020/5/26.
//
#include "Time.h"

// 成员函数initTime的实现
// ::叫做作用域运算符,表示initTime属于Time类
void Time::initTime(int tmphour, int tmpmin, int tmpsec) {
    //成员函数中可以直接使用成员变量名
    // 哪个对象调用的成员函数,这些成员变量就属于对应的对象
    Hour = tmphour;
    Minute = tmpmin;
    Second = tmpsec;

    initMillTime(25);
}

void Time::initMillTime(int mls) {
    Millisecond = mls; //成员函数访问成员变量
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章