门户网站建设公司,甘肃省建筑信息平台,偃师网站建设,公司活动策划方案怎么做一、this 关键字1. 什么是 this#xff1f;this 是 C 中的一个隐式指针#xff0c;它指向当前对象#xff08;即调用成员函数的对象#xff09;#xff0c;在成员函数内部使用#xff0c;用于引用调用该函数的对象。每个类的非静态成员函数内部都可以使用 this。使用 thi…一、this 关键字1. 什么是 thisthis 是 C 中的一个隐式指针它指向当前对象即调用成员函数的对象在成员函数内部使用用于引用调用该函数的对象。每个类的非静态成员函数内部都可以使用 this。使用 this 可以明确指出成员函数正在操作的是哪个对象的数据成员。2. 为什么需要 this当成员函数的参数名与成员变量名相同时可以用 this 来区分。示例代码
#include iostream
using namespace std;class Person {
private:string name;int age;public:// 构造函数参数名与成员变量名相同Person(string name, int age) {this-name name; // 用 this 区分成员变量和参数this-age age;}void printInfo() {// this 可以省略但显式使用更清晰cout Name: this-name , Age: this-age endl;}// 返回当前对象的引用用于链式调用Person setName(string name) {this-name name;return *this; // 返回当前对象本身}
};int main() {Person p(Alice, 25);p.printInfo(); // 输出: Name: Alice, Age: 25// 链式调用p.setName(Bob).printInfo(); // 输出: Name: Bob, Age: 25return 0;
}代码解释在构造函数中参数名 name 和 age 与成员变量同名用 this-name 表示成员变量。printInfo() 中 this 可以省略但显式使用让代码更清晰。setName() 返回 *this即当前对象的引用支持链式调用。3. this 的其他用途传递当前对象给其他函数在成员函数中返回当前对象本身解决局部变量与成员变量同名的问题示例
class Example {int value;
public:Example(int value) {this-value value; // 区分成员变量和参数}void show() {cout Value: value endl; // 等价于 this-value}Example increment() {this-value; // 修改当前对象的成员return *this; // 返回当前对象本身}
};4. this 的注意事项this 是指针不是引用*this 才是当前对象的引用静态成员函数中没有 this因为静态函数不属于任何对象不要随意返回 this 的指针可能导致悬空指针
二、new 关键字1. 什么是 newnew 是 C 中用于动态内存分配的运算符它在堆heap上创建对象并返回指针。2. 为什么需要 new在程序运行时而非编译时决定内存分配创建的对象生命周期不受作用域限制可以创建大型对象栈空间可能不足3. 基本用法示例代码
#include iostream
using namespace std;class Dog {string name;int age;
public:Dog(string n, int a) : name(n), age(a) {}void bark() {cout name says: Woof! Im age years old. endl;}~Dog() {cout name is being destroyed. endl;}
};int main() {// 在堆上创建 Dog 对象Dog* myDog new Dog(Buddy, 3);myDog-bark(); // 输出: Buddy says: Woof! Im 3 years old.// 必须手动释放内存delete myDog; // 输出: Buddy is being destroyed.return 0;
}代码解释new Dog(Buddy, 3) 在堆上创建对象返回指向它的指针。通过指针访问成员用 - 运算符。delete 释放内存并调用析构函数。4. new 的高级用法动态数组分配
int main() {// 动态分配包含 5 个 int 的数组int* arr new int[5];for (int i 0; i 5; i) {arr[i] i * 10; // 赋值}for (int i 0; i 5; i) {cout arr[i] ; // 输出: 0 10 20 30 40}cout endl;// 释放数组要用 delete[]delete[] arr;return 0;
}注意事项数组必须用 delete[] 释放单个对象用 delete。忘记释放会导致内存泄漏。5. new 的替代方案现代 C使用智能指针推荐
#include memoryint main() {// 自动管理内存的 unique_ptrunique_ptrDog smartDog(new Dog(Max, 4));smartDog-bark();// 不需要手动 delete离开作用域自动释放// 更安全的 make_unique (C14)auto smartDog2 make_uniqueDog(Charlie, 5);smartDog2-bark();return 0;
}6. new 的注意事项必须配对使用 delete
int* p new int; // 分配
*p 10;
delete p; // 释放避免内存泄漏
void leakyFunction() {int* leak new int[100]; // 分配但未释放// 如果中间发生异常delete 永远不会执行
} // 内存泄漏不要重复释放
int* p new int;
delete p; // 正确
delete p; // 错误未定义行为检查分配是否成功现代 C 中 new 失败会抛出 std::bad_alloc 异常初始化分配的内存
// C11 统一初始化
int* p1 new int{42}; // 值初始化为 42// 默认初始化值不确定
int* p2 new int;// 动态数组初始化为 0
int* arr new int[10](); // 所有元素初始化为 0三、总结对比特性this 关键字new 运算符作用指向当前对象动态分配内存返回值当前对象的指针新分配内存的指针使用场景成员函数中访问当前对象需要运行时决定内存分配时内存位置不适用是指针堆heap生命周期不适用直到显式 delete 或程序结束错误风险误用可能导致逻辑错误忘记释放导致内存泄漏最佳实践建议this 使用建议在成员变量和参数同名时使用需要返回当前对象时链式调用避免过度使用保持代码清晰new 使用建议优先考虑栈分配或智能指针如果必须用 new确保有对应的 delete对于数组使用 std::vector 代替 new[]在 C11 中优先使用 std::make_unique/std::make_shared现代 C 趋势减少裸 new/delete 的使用使用 RAII资源获取即初始化原则依赖标准库容器和智能指针管理资源