目录
引言
文章思路
一、类的定义
1.类的定义
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;
};
2.类的访问限定符
C++⼀种实现封装的方式,用类将对象的属性与⽅法结合在⼀块,让对象更加完善,通过访问权限 选择性的将其接⼝提供给外部的用户使用。
C++提供了三种访问限定符:public、protected和private。它们用于控制类成员的访问权限。
public
:成员在任何地方都是可访问的。protected
:成员在类内部和派生类中是可访问的。private
:成员只能在类内部访问。
3.class与struct的使用区别
在C++中,class
和struct
都可以用来定义自定义类型,但它们在使用上有一些关键的区别,主要涉及到成员的默认访问权限和继承的默认行为。
- 默认访问权限:
class
中的成员默认是private
的,这意味着在类的外部不能直接访问这些成员,需要通过公有成员函数(方法)来访问。struct
中的成员默认是public
的,这意味着在结构体外部可以直接访问这些成员。
- 继承的默认行为:(同样的,继承的相关内容会放在后续文章展开讲解,这里先简单了解即可)
- 当使用
class
进行继承时,默认是private
继承。这意味着派生类只能访问基类的公有和保护成员,且这些成员在派生类中变成了私有成员。 - 当使用
struct
进行继承时,默认是public
继承。这意味着派生类可以访问基类的公有和保护成员,且这些成员在派生类中保持原有的访问级别(公有或保护)。
- 当使用
4.类域
类域的定义
- 基本概念:类域是由类定义引入的一个作用域,它包含了类中声明的所有成员变量和成员函数。在类域内定义的标识符(如成员变量名、成员函数名)仅在类的范围内有效。
- 类的所有成员都在类的作⽤域中,在类体外定义成员时,需要使用::作用域操作符指明成员属于哪个类域
- 类域影响的是编译的查找规则。下⾯程序中Init如果不指定类域Stack,那么编译器就把Init当成全 局函数,那么编译时,找不到array等成员的声明/定义在哪⾥,就会报错。指定类域Stack,就是知 道Init是成员函数,当前域找不到的array等成员,就会到类域中去查找
#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;
}
类域与其他作用域的关系
二、对象的定义和使用
1.对象的定义
在C++中,定义对象的第一步是定义一个类。类定义了一组具有相同属性和方法的对象的蓝图。下面是一个简单的类的例子:(为了方便理解,将成员变量声明为了公有)
class Car {
public:
string brand; // 数据成员
string model;
int year;
void displayInfo() { // 成员函数
cout << "Brand: " << brand << ", Model: " << model << ", Year: " << year << endl;
}
};
2.对象的使用
一旦定义了类,就可以创建该类的对象了。创建对象的过程称为实例化。
以下是如何创建Car
类的对象并使用它的示例:
int main() {
Car myCar; // 创建对象
myCar.brand = "Toyota"; // 访问数据成员并赋值
myCar.model = "Corolla";
myCar.year = 2020;
myCar.displayInfo(); // 调用成员函数
return 0;
}
在这个例子中,我们创建了一个Car
类的对象myCar
,然后通过点操作符(.
)访问它的数据成员并赋值,最后调用它的成员函数displayInfo
来显示汽车的信息。
3.对象的大小
如何计算对象的大小
内存对齐规则
注意: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;
}
4. this指针
this
指针是 C++ 中一个非常重要的概念,它指向调用成员函数的对象。每个非静态成员函数都有一个 this
指针,它允许成员函数访问调用对象的成员变量和其他成员函数。
下面将详细讲解 this
指针的基本概念、使用规则和注意事项。
基本概念
使用规则
注意事项
结语
本文完,更多相关知识请关注后续文章。