源码下载网站源码,外贸set是什么意思,南京做征信服务的公司网站,广州网页设计培训视频C中的this指针、访问控制和构造函数
this指针
在C中#xff0c;this指针是一个特殊的指针#xff0c;它指向当前对象的地址。每个非静态成员函数#xff08;包括成员函数模板#xff09;都有一个this指针作为其隐含参数#xff0c;这意味着在成员函数内部#xff0c;th…C中的this指针、访问控制和构造函数
this指针
在C中this指针是一个特殊的指针它指向当前对象的地址。每个非静态成员函数包括成员函数模板都有一个this指针作为其隐含参数这意味着在成员函数内部this可以用来引用调用该成员函数的对象。this指针是自动传递给成员函数的但在成员函数的参数列表中不可见。
this指针的用途
1. 明确成员访问
当局部变量例如函数参数的名称与类的成员变量名称相同时可以使用this指针来区分它们明确指出是对成员变量的访问。
class Example {
public:int value;void setValue(int value) {this-value value; // 明确指出成员变量value}
};2. 实现链式调用
this指针可以用于实现函数的链式调用。通过在成员函数的末尾返回*this可以连续调用同一个对象上的其他成员函数。
class Example {
public:Example setValue(int value) {this-value value;return *this;}Example doSomething() {// 操作return *this;}
};Example obj;
obj.setValue(5).doSomething(); // 链式调用3. 返回对象自身的引用或指针
在某些情况下可能需要从成员函数返回调用它的对象自身的引用或指针this提供了这种能力。
class Example {
public:Example* getThis() {return this; // 返回当前对象的指针}
};4. 比较对象
this指针可以用于比较两个对象是否相同即它们是否是内存中同一个对象的两个引用。
class Example {
public:bool compare(const Example other) const {return this other; // 比较两个对象的地址}
};注意事项
在静态成员函数中不能使用this指针因为静态成员函数不属于任何对象实例。this是一个常量指针不能修改它本身的值即不能使this指向另一个对象但可以修改this所指向的对象的成员。在构造函数和析构函数中使用this指针时需要小心特别是在构造函数中因为对象可能还没有完全构造完成。
总的来说this指针在C类的成员函数中自动可用提供了一种访问调用函数的当前对象的便捷方式。
访问控制
在C中访问控制是面向对象编程的一个核心特性它定义了如何访问类的成员包括数据成员和成员函数。访问控制旨在提高数据的封装性和安全性通过限制对类成员的访问来防止外部代码随意修改对象的内部状态。
C提供三种访问控制级别public、private和protected这些访问控制符可以用于类的成员变量和成员函数。
Public公有
public成员在任何地方都可以被访问无论是类的内部还是外部。使用公有成员可以提供类的接口允许外部代码通过这些接口与对象交互。
Private私有
private成员只能被其所在类的成员函数、友元函数和友元类访问。私有成员用于实现类的内部细节隐藏类的实现这是封装的一个重要方面。
Protected受保护
protected成员可以被其所在类的成员函数、友元函数和友元类访问同时也可以被派生类访问。protected访问控制符主要用于继承场景允许派生类访问基类的成员而不对外界公开。
访问控制与继承
在继承中基类成员的访问权限在派生类中可能会有所变化这取决于继承的类型public、protected或private继承
公有继承public基类的公有成员和受保护成员在派生类中保持其原有的访问级别基类的私有成员在派生类中不可访问。保护继承protected基类的公有成员和受保护成员在派生类中都变成受保护成员基类的私有成员在派生类中不可访问。私有继承private基类的公有成员和受保护成员在派生类中都变成私有成员基类的私有成员在派生类中不可访问。
示例
class Base {
public:int publicMember;
protected:int protectedMember;
private:int privateMember;
};class Derived : public Base {void func() {publicMember 1; // OK: public成员在派生类中可访问protectedMember 2; // OK: protected成员在派生类中可访问// privateMember 3; // 错误: private成员在派生类中不可访问}
};int main() {Base b;b.publicMember 1; // OK: public成员在外部可访问// b.protectedMember 2; // 错误: protected成员在外部不可访问// b.privateMember 3; // 错误: private成员在外部不可访问
}总之C中的访问控制是实现封装和继承的关键机制它帮助程序员定义类成员的可见性和可访问性以确保对象的内部状态被适当地保护。
构造函数
在C中构造函数是一种特殊的成员函数它在创建类的对象时自动调用用于初始化对象。构造函数的主要目的是为对象的成员变量设置初始值并执行任何必要的设置或分配资源的操作。
构造函数的特点
与类同名构造函数的名称必须与类名相同。无返回类型构造函数没有返回值也不声明返回类型连void也不写。可以被重载一个类可以有多个构造函数它们通过参数列表的不同进行区分。自动调用构造函数在创建类的新对象时被自动调用。
构造函数的类型 默认构造函数不带任何参数也可以是所有参数都有默认值的构造函数。如果类中没有定义任何构造函数编译器会自动生成一个默认构造函数只在没有其他构造函数时。 class Example {
public:Example() { /* 默认构造函数体 */ }
};参数化构造函数带有参数的构造函数用于通过提供的参数初始化对象的成员变量。 class Example {
public:Example(int a, double b) { /* 构造函数体 */ }
};拷贝构造函数以同类的对象作为参数的构造函数用于初始化一个对象为另一个同类型对象的副本。 class Example {
public:Example(const Example other) { /* 拷贝构造函数体 */ }
};移动构造函数C11引入以同类对象的右值引用作为参数的构造函数用于实现对象的移动语义而非复制。 class Example {
public:Example(Example other) noexcept { /* 移动构造函数体 */ }
};构造函数的使用 直接初始化使用圆括号来初始化对象。 Example obj1; // 调用默认构造函数
Example obj2(5, 3.14); // 调用参数化构造函数拷贝初始化使用等号和另一个对象来初始化新对象。 Example obj3 obj2; // 调用拷贝构造函数列表初始化C11引入使用花括号来初始化对象。 Example obj4{}; // 调用默认构造函数
Example obj5{5, 3.14}; // 调用参数化构造函数移动初始化使用std::move来强制调用移动构造函数。 Example obj6 std::move(obj5); // 调用移动构造函数注意事项
当定义了其他构造函数时编译器不再自动生成默认构造函数。如果需要默认构造函数必须显式定义。拷贝构造函数和移动构造函数对于实现值语义和管理资源非常重要。在构造函数中使用初始化列表而非在构造函数体内赋值通常更有效特别是对于引用和常量成员变量。
构造函数是C面向对象编程中的一个基本概念正确理解和使用构造函数对于创建稳定、高效的C程序至关重要。
struct和class
在C中struct结构体和class类都是用户自定义类型的关键构建块它们提供了数据封装的功能。尽管struct和class在很多方面非常相似它们之间主要的区别在于默认的访问控制和继承类型。
默认访问控制和继承
struct的成员默认是public的而class的成员默认是private的。这意味着除非你明确指定访问级别否则struct成员在外部是可访问的而class成员则不是。当使用struct继承另一个struct或class时继承默认是public的而在class中继承另一个class时继承默认是private的。
用法和语义
struct在C中struct通常用于定义简单的数据结构其中主要包含数据成员而没有太多的函数成员方法。struct特别适用于当你想要打包一些数据在一起时这与C语言中的struct用法类似。classclass则通常用于定义更复杂的数据结构它不仅包含数据成员还包含操作这些数据的成员函数。class是实现面向对象编程OOP概念如封装、继承、多态的主要工具。
示例
下面是一个struct和class的简单示例以展示它们的基本用法
struct Point {int x, y; // 默认publicPoint(int x, int y) : x(x), y(y) {} // 构造函数也是public
};class Rectangle {
private:Point topLeft, bottomRight; // 默认privatepublic:Rectangle(const Point tl, const Point br) : topLeft(tl), bottomRight(br) {}void printCorners() { // 成员函数是publiccout Top Left: ( topLeft.x , topLeft.y ) , Bottom Right: ( bottomRight.x , bottomRight.y ) endl;}
};int main() {Point p(0, 0); // 直接访问Point的成员变量Rectangle r(Point(0, 10), Point(10, 0)); // 通过构造函数初始化Rectangler.printCorners(); // 调用Rectangle的成员函数
}总结
尽管struct和class在C中非常相似两者都可以用来定义含有数据成员和成员函数的类型但它们在默认访问控制和默认继承类型上有所不同。选择使用struct还是class取决于你的特定需求以及你对类型成员的默认访问权限的期望。一般而言如果一个类型主要用于存储数据并且你希望其成员默认为公有那么使用struct可能更合适如果你需要更多的封装和面向对象的特性那么class将是更好的选择。
示例代码
#include iostream
#include string
using namespace std;// 定义student类
class student {
private:string name; // 私有成员变量学生的姓名double score; // 私有成员变量学生的分数public:// student类的构造函数// 当创建student对象时此构造函数被自动调用以初始化对象student(string n, double s) {name n; // 初始化姓名score s; // 初始化分数cout 构造函数\n; // 打印构造函数被调用的消息}// 打印学生信息的成员函数void print() {// 使用this指针访问成员变量打印学生的姓名和分数cout this-name this-score endl;}// 访问器函数获取学生的姓名string get_name() { return name; }// 访问器函数获取学生的分数double get_score() { return score; }// 修改器函数设置学生的姓名void set_name(string n) { name n; }// 修改器函数设置学生的分数void set_score(double s) { score s; }
};int main() {// 创建一个名为stu的student对象使用参数化构造函数初始化姓名和分数student stu(cz, 90);// 使用修改器函数更新stu对象的姓名和分数stu.set_name(Li ping);stu.set_score(78.5);// 调用stu对象的print函数打印更新后的学生信息stu.print();//print(stu);// 使用访问器函数获取并打印stu对象的姓名和分数cout stu.get_name() stu.get_score() endl;return 0;
}