C++学习第十一课:类和对象的奥秘
在C++中,类是面向对象编程的核心概念,它允许你将数据和行为封装在一起,创建出具有特定属性和方法的对象。本课将介绍类的声明、实例化、成员访问、构造函数以及初始化列表的使用。
1. 类和对象基础
- 类的定义:类是创建对象的蓝图,包含数据成员(属性)和成员函数(方法)。
- 对象的实例化:根据类创建具体对象的过程。
class MyClass {
public:
int myData;
void myMethod() {
std::cout << "Hello from myMethod" << std::endl;
}
};
int main() {
MyClass myObject; // 实例化MyClass创建对象myObject
myObject.myData = 10;
myObject.myMethod(); // 调用对象的成员函数
return 0;
}
2. 成员访问
public
和private
关键字:控制成员的访问权限。public
:类的成员可以被外部访问。private
:类的成员只能被类的内部访问。
class MyClass {
private:
int privateData; // 私有数据成员
public:
void setData(int data) {
privateData = data; // 通过公共方法访问私有成员
}
int getData() const {
return privateData; // 常量成员函数,不能修改对象状态
}
};
3. 构造函数
- 声明和实现构造函数:构造函数是类的特殊成员函数,用于初始化对象。
- 带参和不带参的构造函数:允许类在创建对象时传入不同的初始化参数。
class MyClass {
private:
int value;
public:
// 无参构造函数
MyClass() : value(0) {}
// 带参构造函数
MyClass(int v) : value(v) {}
int getValue() const {
return value;
}
};
4. 构造函数的初始化列表
- 使用初始化列表来初始化成员变量,这是C++中推荐的初始化方式。
class MyClass {
private:
int importantValue;
public:
MyClass(int iv) : importantValue(iv) {
// 初始化列表已经初始化了importantValue,这里可以执行其他初始化
}
};
5. 析构函数
- 声明和实现析构函数:析构函数是类的另一个特殊成员函数,当对象生命周期结束时自动调用。
class MyClass {
public:
~MyClass() {
std::cout << "MyClass object destroyed" << std::endl;
}
};
6. 析构函数
- 析构函数:当对象生命周期结束时自动调用的特殊成员函数,用于执行清理工作。
class Resource {
public:
~Resource() {
std::cout << "Resource is being cleaned up" << std::endl;
// 释放资源,如关闭文件、释放内存等
}
};
int main() {
Resource res;
// 当main函数结束时,res的析构函数被调用
return 0;
}
7. 复杂的构造函数
- 参数默认值:为构造函数的参数提供默认值。
class Circle {
public:
// 带默认参数值的构造函数
Circle(double r = 1.0) : radius(r) {}
private:
double radius;
};
- 构造函数的重载:为类提供多个构造函数,以不同的方式初始化对象。
class Rectangle {
public:
// 无参构造函数
Rectangle() : width(0), height(0) {}
// 带参构造函数
Rectangle(double w, double h) : width(w), height(h) {}
private:
double width;
double height;
};
8. 构造函数和析构函数的其他用途
- 资源管理:管理动态分配的资源,如内存、文件句柄等。
- 继承:在派生类的构造函数和析构函数中调用基类的构造函数和析构函数。
9. this
指针
this
指针:指向当前对象的指针,用于区分对象的实例变量和局部变量。
class Example {
public:
void print() {
std::cout << this << std::endl; // 输出this指针的地址
std::cout << &this->value << std::endl; // 输出成员变量value的地址
}
private:
int value;
};
int main() {
Example ex;
ex.print(); // 打印对象的地址和成员变量的地址
return 0;
}
10. sizeof
用于类
sizeof
运算符可以用于获取类的内存占用大小。
class Data {
int a;
double b;
};
int main() {
std::cout << "Size of Data: " << sizeof(Data) << " bytes" << std::endl;
return 0;
}
11. 友元
- 友元(Friendship):允许非成员函数或另一个类的成员函数访问类的私有(
private
)和保护(protected
)成员。
class Account;
class Transaction {
Account* account;
public:
void deposit(double amount);
};
class Account {
friend class Transaction; // 声明Transaction为友元
double balance;
public:
Account(double b) : balance(b) {}
void credit(double amount) {
balance += amount; // 只能由Account的成员函数或友元函数调用
}
};
结语
通过本课的学习,你了解了析构函数的作用、构造函数的复杂性、this
指针的使用、sizeof
运算符在类中的应用,以及友元的概念。
这些概念对于深入理解C++中的类和对象至关重要。它们不仅提供了强大的功能,也要求开发者对资源管理和类的设计有深刻的认识。