本博客将记录:类这个知识点的笔记!
(这个在学习C++基础课程时已经学习过一次了,这里再次简单地回顾一下而已)
这方面知识分为以下4个点:
一、综述
二、类基础
三、成员函数
四、对象的拷贝
一、综述:
类是我们自定义的数据类型(区别于内置的数据类型比如int/float/double)
设置类时要考虑的角度:
①站在程序员(设计者)的角度来考虑(你要设计哪些成员函数?有哪些成员?这些都是设计者设计类时需要考虑的事情)
②站在使用者的角度来考虑(你到底要给使用你定义的类的用户开放啥函数接口?还有对用户禁止开放哪些函数接口?这些都需要我们设计类时站在使用者的角度来thinking)
③父类、子类问题(这就会涉及到继承和多态这2个总要话题)
二、类基础:
①一个类就是一个用户自定义的一个数据类型,我们可以把类想象成一个命名空间,包着一堆东西(成员函数and成员变量)
②一个类的构成:成员变量、成员函数(有许多特殊的成员函数,后序会慢慢讲解)
注意:一个类,如果你给其定义默认构造函数、默认拷贝构造函数、默认析构函数 的话,那么系统或者说编译器就会给你自动生成空实现的上述3种函数,所谓空实现其实就是函数体内的语句都为空的意思。
当然,一旦你定义了上述3个函数中的1种,那么编译器就不会再自动给你定义空实现的该类函数了
③访问类的成员时:
-if你定义了类的对象,那么就用 对象名.成员名 来访问成员
-if你定义了指向这个类对象的指针,那么就用 指针名 ->成员名 来访问成员
Person p1(888); p1.m_Age = 999; cout << p1.m_Age << endl;//999 Person* p2 = new Person; p2->m_Age = 100; cout << p2->m_Age << endl;//100
④public访问权限的成员提供类的接口,是暴露给外界、供外界调用的。
private访问权限的成员提供各种实现类功能的细节,但不提供给使用者(也即使用者无法使用)。
这里对于C++中的三种继承方式的再理解,可以看我之前写的博客:
C++中的三种继承方式
⑤在cpp中,struct是成员访问权限默认为public的class,class的成员访问权限则默认为private
struct A{......} 等价于 class A{public: ......}
class A{......}等价于 class A{private:......}
当然,一般而言我们都是写class的,极少会使用struct
三、成员函数
Time.h:
#ifndef __TIME_H__ #define __TIME_H__ #includeusing namespace std; class Time { public: int m_Hour;//时 int m_Minute;//分 int m_Second;//秒 public: Time():m_Hour(0), m_Minute(0), m_Second(0){} //构造函数 Time(int h,int m,int s) :m_Hour(h), m_Minute(m), m_Second(s){} //成员函数:(其实也包括构造和析构函数) //我们注意到,哪个对象调用了成员函数时,这些成员变量就会属于哪个对象 //我们可以理解为:类的成员函数知道 到底是哪个对象调用自己的。 void reviseTime(int h, int m, int s); void showTime(); Time(const Time& t); Time& operator=(const Time& t); }; #endif
Time.cpp:
#include"Time.h"
void Time::reviseTime(int h, int m, int s) {
this->m_Hour = h;
this->m_Minute = m;
this->m_Second = s;
}
void Time::showTime() {
cout << this->m_Hour << endl;
cout << this->m_Minute << endl;
cout << this->m_Second << endl;
}
//拷贝构造函数
Time::Time(const Time& t)
{
cout << "拷贝构造啦啦啦!" << endl;
this->m_Hour = t.m_Hour;//时
this->m_Minute = t.m_Minute;//分
this->m_Second = t.m_Second;//秒
}
//拷贝赋值函数
Time& Time::operator=(const Time& t) {
cout << "拷贝赋值啦啦啦!" << endl;
this->m_Hour = t.m_Hour;//时
this->m_Minute = t.m_Minute;//分
this->m_Second = t.m_Second;//秒
return *this;
}
main.cpp:
#include#include"Time.h" using namespace std; void test() { Time t; t.reviseTime(11, 14, 5); cout << t.m_Hour << endl; cout << t.m_Minute << endl; cout << t.m_Second << endl; } int main(void) { test(); system("pause"); return 0; }
四、对象的拷贝:(也可以称之为定义对象时对其进行初始化)
//在上述main.cpp中继续添加如下代码:
Time t;
t.reviseTime(11, 14, 5);
Time t2;
t2.reviseTime(12, 26, 4);
Time t3 = t2;//拷贝方式1 这是拷贝构造do的事情
Time t4(t2);//拷贝方式2 这是拷贝构造do的事情
Time t5{ t2 };//拷贝方式3 这是拷贝构造do的事情
Time t6 = { t2 };//拷贝方式4 这是拷贝构造do的事情
t3.showTime();//12 26 4
t4.showTime();//12 26 4
t5.showTime();//12 26 4
t6.showTime();//12 26 4
以上这些拷贝都是基于类中的拷贝构造函数的,也即上述所写的:
Time::Time(const Time& t)
{
cout << "拷贝构造啦啦啦!" << endl;
this->m_Hour = t.m_Hour;//时
this->m_Minute = t.m_Minute;//分
this->m_Second = t.m_Second;//秒
}
注意事项:
①千万不要把拷贝构造函数和拷贝赋值函数理解为同一个函数,虽然这2个函数都能实现类似的拷贝赋值的功能,但也千万不要混淆了!
②如果说你不想单纯的do这样的浅拷贝(也即简单的赋值拷贝)操作的话,你还想do深拷贝操作的话,那么你大可以自己去写一个拷贝构造函数or拷贝赋值函数去达到你的目的。
注解:关于深拷贝和浅拷贝在我很早之前写的文章中有所提及,如果你现在看到我的总结笔记认为自己不懂这个知识点,那么你大可以去百度or就在本站去搜求了解学习它,或者等我后序的学习笔记总结,我都会把这些细枝末节但又重要的知识点总结好,以便于自己日后coding复习或者供各位努力的人儿复习使用。
好,那么以上就是这一3.1小节我所回顾的内容的学习笔记,希望你能读懂并且消化完,也希望自己能牢记这些小小的细节知识点,加油吧,我们都在coding的路上~



