
引言
在C++编程中,类和对象是面向对象编程(OOP)的基石。类是一种自定义的数据类型,它允许我们将数据(成员变量)和操作数据的方法(成员函数)封装在一起。对象则是类的实例,它根据类的定义被创建,并可以执行类中定义的操作。 本文将深入探讨C++中类和对象的基本概念。
文章思路
class开始,后跟类名和类体。{}中,并包含成员变量和成员函数的声明。class MyClass
{
public:
int myNumber; //成员变量
void myFunction(); //成员函数
};在上面的例子中,MyClass是一个类,它有一个成员变量myNumber和一个成员函数myFunction。
注意事项
以下是一个日期类的简单示例:
(关于public等关键字,可参考下文:类的访问限定符)
class Date
{
public:
void Init(int year, int month, int day)//类中定义默认为内联函数
{
_year = year;
_month = month;
_day = day;
}
private:
// 为了区分成员变量,⼀般习惯上成员变量
// 会加⼀个特殊标识,如_ 或者 m开头
int _year; // year_ m_year
int _month;
int _day;
};C++⼀种实现封装的方式,用类将对象的属性与⽅法结合在⼀块,让对象更加完善,通过访问权限 选择性的将其接⼝提供给外部的用户使用。
C++提供了三种访问限定符:public、protected和private。它们用于控制类成员的访问权限。
public:成员在任何地方都是可访问的。protected:成员在类内部和派生类中是可访问的。private:成员只能在类内部访问。在C++中,class和struct都可以用来定义自定义类型,但它们在使用上有一些关键的区别,主要涉及到成员的默认访问权限和继承的默认行为。
class中的成员默认是private的,这意味着在类的外部不能直接访问这些成员,需要通过公有成员函数(方法)来访问。struct中的成员默认是public的,这意味着在结构体外部可以直接访问这些成员。class进行继承时,默认是private继承。这意味着派生类只能访问基类的公有和保护成员,且这些成员在派生类中变成了私有成员。struct进行继承时,默认是public继承。这意味着派生类可以访问基类的公有和保护成员,且这些成员在派生类中保持原有的访问级别(公有或保护)。类域的定义
#include<iostream>
using namespace std;
class Stack
{
public:
// 成员函数
void Init(int n = 4);
private:
// 成员变量
int* array;
size_t capacity;
size_t top;
};
// 声明和定义分离,需要指定类域
void Stack::Init(int n)
{
array = (int*)malloc(sizeof(int) * n);
if (nullptr == array)
{
perror("malloc申请空间失败");
return;
}
capacity = n;
top = 0;
}
int main()
{
Stack st;
st.Init();
return 0;
}类域与其他作用域的关系
在C++中,定义对象的第一步是定义一个类。类定义了一组具有相同属性和方法的对象的蓝图。下面是一个简单的类的例子:(为了方便理解,将成员变量声明为了公有)
class Car {
public:
string brand; // 数据成员
string model;
int year;
void displayInfo() { // 成员函数
cout << "Brand: " << brand << ", Model: " << model << ", Year: " << year << endl;
}
};一旦定义了类,就可以创建该类的对象了。创建对象的过程称为实例化。

以下是如何创建Car类的对象并使用它的示例:
int main() {
Car myCar; // 创建对象
myCar.brand = "Toyota"; // 访问数据成员并赋值
myCar.model = "Corolla";
myCar.year = 2020;
myCar.displayInfo(); // 调用成员函数
return 0;
}在这个例子中,我们创建了一个Car类的对象myCar,然后通过点操作符(.)访问它的数据成员并赋值,最后调用它的成员函数displayInfo来显示汽车的信息。
对象在内存中的大小是由其成员变量决定的。成员函数不占用对象的空间,因为所有对象共享同一个成员函数实例。 在C++中,对象的大小是指该对象所占用的内存字节数。对象的大小可以通过
sizeof运算符来计算。sizeof运算符可以用于任何数据类型,包括类类型。
如何计算对象的大小
int、float、char等),它们的大小是固定的,并且可以通过sizeof运算符直接得到。
sizeof运算符将返回该类的一个对象所占用的字节数。这个大小包括了类的所有非静态数据成员的大小,以及由于对齐而可能添加的任何填充字节。
内存对齐规则
注意:C++中对象的内存对齐规则与C语言中结构体的对齐规则是完全一致的
示例:
#include<iostream>
using namespace std;
// 计算⼀下A/B/C实例化的对象是多⼤?
class A
{
public:
void Print()
{
cout << _ch << endl;
}
private:
char _ch;
int _i;
};
class B
{
public:
void Print()
{
//...
}
};
class C
{};
int main()
{
A a;
B b;
C c;
cout << sizeof(a) << endl;
cout << sizeof(b) << endl;
cout << sizeof(c) << endl;
return 0;
}
注意: 上⾯的程序运⾏后,我们看到没有成员变量的B和C类对象的大小是1,为什么没有成员变量还要给1个 字节呢?因为如果⼀个字节都不给,怎么表示对象存在过呢!所以这里给1字节,纯粹是为了占位标识 对象存在。
this 指针是 C++ 中一个非常重要的概念,它指向调用成员函数的对象。每个非静态成员函数都有一个 this 指针,它允许成员函数访问调用对象的成员变量和其他成员函数。
下面将详细讲解 this 指针的基本概念、使用规则和注意事项。
基本概念
this 是一个指针,它指向调用成员函数的对象,类型为 类的类型* const this。this 指针是自动定义的,不需要用户显式声明也不可以。同时说明this指针并不是对象内存空间的一部分,它不会影响对象的大小(即sizeof(对象)的结果)this 指针主要用于访问调用对象的成员变量和成员函数。使用规则
this 指针,可以访问调用对象的成员变量。例如,this->member_variable。this 指针,可以调用调用对象的成员函数。例如,this->member_function()。*this,即返回调用对象本身。这常用于链式调用。this 指针来区分它们。注意事项
this 指针,因为它们不属于任何对象,而是属于整个类。this 指针指向正在被构造的对象。在析构函数中,this 指针指向正在被析构的对象。*this 的注意事项:当成员函数返回 *this 时,需要注意返回值的类型应该是类的引用或指针,以避免不必要的对象复制。this 指针的类型:this 指针的类型是指向类类型的指针,具体类型取决于成员函数所属的类。this 指针的不可变性:在成员函数内部,不能改变 this 指针的值,因为他被const修饰。它始终指向调用对象。结语
本文介绍了C++中类和对象的基本概念,包括类的定义、访问限定符的作用、class和struct的使用区别、对象的定义和使用、对象的大小以及this指针的概念和用途。这些概念是C++面向对象编程的基础,掌握它们对于编写高效、可维护的C++代码至关重要。
本文完,更多相关知识请关注后续文章。