目录
一、类的定义
定义方式一:定义与声明都在类中
定义方式二:定义与声明分离
二、类的实例化&&类对象存储方式
类的实例化
类对象存储模式
三、this指针
一、类的定义
定义方式一:定义与声明都在类中
#include<iostream>
using namespace std;
class Date
{
public:
//成员函数
void Init(int year = 1, int month = 1, int day = 1)
{
_year = year;
_month = month;
_day = day;
}
private:
//成员变量
int _year;
int _month;
int _day;
};
定义方式二:定义与声明分离
Date.h
#include<iostream>
using namespace std;
class Date
{
public:
//成员函数
void Init(int year = 1, int month = 1, int day = 1);
private:
//成员变量
int _year;
int _month;
int _day;
};
Date.cpp
#include"Date.h"
void Date::Init(int year = 1, int month = 1, int day = 1)
{
_year = year;
_month = month;
_day = day;
}
总结:
1.public表示公有成员,类外面可以访问;private表示私有成员,类外面不能访问
2.C++中结构体和类内部都可以定义函数,区别是结构体默认访问限定符为public,类默认访问限定符为private
3.访问限定符作用范围从当前开始到下一个访问限定符或者类结束的地方结束
4.类的声明和定义分离时定义函数时必须指明 类名::函数名,否则编译报错
5.为了区分成员变量与成员函数形参,成员变量的命名前面通常前加_ 或者后加_
二、类的实例化&&类对象存储方式
类的实例化
类相当于图纸,类创建出对象好比根据图纸建造出了房子,类不占据空间,对象才占空间
而类创建对象就叫做类的实例化
#include<iostream>
using namespace std;
class Date
{
public:
//成员函数
void Init(int year = 1, int month = 1, int day = 1)
{
_year = year;
_month = month;
_day = day;
}
private:
//成员变量
int _year;
int _month;
int _day;
};
int main()
{
//Date::Init(); //(×)对象还没创建出来,不能用类名去访问
Date d;
d.Init(); //(√)
}
类对象存储模式
结论:类创建出的对象只存储成员变量(遵守结构体内存对齐规则),不存储成员函数,成员函数位于公共代码区
验证:
#include<iostream>
using namespace std;
class Date
{
public:
//成员函数
void Init(int year = 1, int month = 1, int day = 1)
{
_year = year;
_month = month;
_day = day;
}
private:
//成员变量
int _year;
int _month;
int _day;
};
int main()
{
Date d1;
cout << sizeof(d1) << endl; //12个字节
}
补充:当类中只有成员函数或者类为空时,为了标识该对象,内存给对象分配了1个字节空间
#include<iostream>
using namespace std;
class A
{
void Init()
{
cout << "Init()" << endl;
}
};
class B
{};
int main()
{
A a;
cout << sizeof(a) << endl; //1个字节
B b;
cout << sizeof(a) << endl; //1个字节
}
三、this指针
问题引入:Init()函数位于公共代码区,d1,d2都调用了Init()函数来初始化,那Init()函数如何区分设置d1还是d2呢?
#include<iostream>
using namespace std;
class Date
{
public:
//成员函数
void Init(int year = 1, int month = 1, int day = 1)
{
_year = year;
_month = month;
_day = day;
}
private:
//成员变量
int _year;
int _month;
int _day;
};
int main()
{
Date d1;
d1.Init(2023 ,8, 3);
Date d2;
d1.Init(2023, 8, 4);
}
C++给每个非静态的成员函数增加了一个隐藏的指针形参(this指针), 哪个对象去调用成员函数,this指针就会保存该对象的地址,从而完成对不同对象的实现,所以成员函数内部都是用this指针实现的
#include<iostream>
using namespace std;
class Date
{
public:
//成员函数
void Init(int year = 1, int month = 1, int day = 1)
{
this->_year = year;
this->_month = month;
this->_day = day;
}
private:
//成员变量
int _year;
int _month;
int _day;
};
int main()
{
Date d1;
d1.Init(2023 ,8, 3);
Date d2;
d1.Init(2023, 8, 4);
}
this指针的特点:
1.本质是成员函数的第一个形参
2.被const修饰(const 类名* this), 函数内部不能改变this指针本身
3.只能在成员函数内部使用
4.不存在于对象中
5.不需要用户显式传递,编译器自动实现
以此共勉:人生万事须自为,跬步江山即寥廓