当前位置: 首页 > news >正文

做网站被骗预付款怎么办贵阳公众号开发公司

做网站被骗预付款怎么办,贵阳公众号开发公司,html手机网站开发后端,推广引流平台文章目录 【C篇】C类与对象深度解析#xff08;二#xff09;前言1. 类的默认成员函数2. 构造函数2.1 函数名与类名相同2.2 无返回值2.3 对象实例化时系统会自动调用2.4 构造函数可以重载2.5 默认构造函数的生成规则2.6 无参构造函数与全缺省构造函数的关系2.7 内置类型与自定… 文章目录 【C篇】C类与对象深度解析二前言1. 类的默认成员函数2. 构造函数2.1 函数名与类名相同2.2 无返回值2.3 对象实例化时系统会自动调用2.4 构造函数可以重载2.5 默认构造函数的生成规则2.6 无参构造函数与全缺省构造函数的关系2.7 内置类型与自定义类型成员变量的初始化 示例代码梳理3. 析构函数1. 析构函数名2. 无参数无返回值3. 一个类只能有一个析构函数4. 对象生命周期结束时系统会自动调用析构函数5. 跟构造函数类似编译器自动生成的析构函数对内置类型成员不做处理6. 显式写析构函数情况7. 析构函数可以不写的情况8. 一个局部域的多个对象C规定后定义的先析构 示例代码梳理使用C实现的Stack解决括号匹配问题4. 拷贝构造函数1. 拷贝构造函数是构造函数的一个重载2. 拷贝构造函数的第一个参数必须是类类型对象的引用3. C规定自定义类型对象进行拷贝时必须调用拷贝构造函数4. 若未显式定义拷贝构造函数编译器会自动生成5. 编译器自动生成的拷贝构造函数对内置类型和自定义类型的处理6. 拷贝构造函数在传值返回时的行为 示例代码梳理 写在最后 【C篇】C类与对象深度解析二 前言 欢迎讨论如果你在学习过程中有任何问题或想法欢迎在评论区留言我们一起交流学习。你的支持是我继续创作的动力 点赞、收藏与分享觉得这篇文章对你有帮助吗别忘了点赞、收藏并分享给更多的小伙伴哦你们的支持是我不断进步的动力 分享给更多人如果你觉得这篇文章对你有帮助欢迎分享给更多对C感兴趣的朋友让我们一起进步 接上篇C类与对象深度解析一从抽象到实践的全面入门指南 在上篇文章《C类与对象深度解析一从抽象到实践的全面入门指南》我们初步探讨了C类的基本概念和核心特性。在这篇文章中我们将深入理解C中的默认成员函数这些函数是类的基石理解它们对于掌握C面向对象编程至关重要。本篇将侧重于解析构造函数、析构函数及拷贝构造函数这些都是C自动为类生成的成员函数它们在类对象的生命周期管理中扮演着关键角色。 1. 类的默认成员函数 在C中默认成员函数是指用户没有显式实现而由编译器自动生成的成员函数。一个类在没有显式定义特定成员函数的情况下编译器会自动生成以下6个默认成员函数。理解这些默认成员函数的行为和作用是掌握C类机制的基础。 补充 移动构造函数和移动赋值运算符是在C11引入的用于优化资源的移动操作减少不必要的拷贝。如果用户没有显式定义编译器会自动生成这两个函数。 行为默认的移动构造函数和移动赋值运算符会将资源从一个对象“移动”到另一个对象源对象的资源会被“剥离”。需求对于那些管理动态资源的类显式定义这些函数可以显著提高程序的效率避免冗余的资源分配和释放操作。 本篇详细介绍前三个成员函数 2. 构造函数 构造函数是用于初始化对象的特殊成员函数。虽然名称为“构造”但它的主要任务是初始化对象的成员变量而不是为对象分配内存。构造函数的使用对于确保对象在创建时处于有效状态至关重要。 2.1 函数名与类名相同 构造函数的名字必须与类名相同。这是C的语法要求 解释构造函数的名字与类名相同使得编译器能够识别它是用于初始化对象的函数而不是普通的成员函数。示例class MyClass { public:MyClass() { /* 构造函数体 */ } };2.2 无返回值 构造函数没有返回值甚至不能声明void。这是C语言规定的构造函数的唯一目的是初始化对象因此不需要返回任何值。 解释构造函数的任务是初始化对象而不是返回数据。返回值的存在会违背构造函数的设计目的。示例class MyClass { public:MyClass() { /* 构造函数体无返回值 */ } };2.3 对象实例化时系统会自动调用 构造函数在对象实例化时自动调用。开发者不需要显式调用构造函数编译器会在对象创建时自动执行它。 解释构造函数的自动调用确保了对象在创建时立即处于有效状态。无论对象是作为局部变量、全局变量还是动态分配的变量构造函数都会在创建时运行。示例MyClass obj; // 调用构造函数2.4 构造函数可以重载 构造函数可以重载即同一个类中可以有多个构造函数它们的参数列表必须不同。这允许对象在创建时根据不同的需求进行不同的初始化。 解释通过构造函数的重载可以灵活地初始化对象。例如一个类可以有无参构造函数和带参构造函数以满足不同的初始化需求。示例class MyClass { public:MyClass() { /* 无参构造函数 */ }MyClass(int x) { /* 带参构造函数 */ } };2.5 默认构造函数的生成规则 如果类中没有显式定义构造函数编译器会自动生成一个无参的默认构造函数。但一旦用户定义了任何构造函数编译器就不再生成默认构造函数。 解释默认构造函数提供了一个基本的初始化方式。如果用户定义了其他形式的构造函数如带参数的编译器认为用户不再需要默认构造函数因此不会自动生成。示例class MyClass {// 没有显式定义构造函数编译器会生成默认的无参构造函数 }; MyClass obj; // 调用默认构造函数2.6 无参构造函数与全缺省构造函数的关系 无参构造函数、全缺省构造函数、默认生成的构造函数不能同时存在。如果定义了无参构造函数或全缺省构造函数编译器将不会再生成默认构造函数。 解释这三种构造函数提供了相似的功能即初始化对象而不需要显式提供参数。为了避免冲突它们只能存在其中之一。示例class MyClass { public:MyClass() { /* 无参构造函数 */ }// MyClass(int x 0) { /* 全缺省构造函数不能与无参构造函数同时存在 */ } };注意无参构造函数、全缺省构造函数、编译器自动默认生成的构造函数全都叫默认构造函数总结来说可以不传参的就是默认构造函数这三个不能同时存在但是默认构造函数可以和带参的构造函数同时存在即上文所说的函数重载例如半缺省、没有缺省值等的普通构造函数。 有点绕多品读一下 示例如下 #include iostream using namespace std;class MyClass { public:// 全缺省构造函数即默认构造函数MyClass(int x 10, int y 20) {cout Called MyClass(int x 10, int y 20) endl;cout x x , y y endl;}// 普通带参构造函数没有缺省值MyClass(double z) {cout Called MyClass(double z) endl;cout z z endl;} };int main() {MyClass obj1; // 调用全缺省构造函数MyClass obj2(100); // 调用全缺省构造函数因为100是int类型MyClass obj3(3.14); // 调用普通的带参构造函数return 0; }2.7 内置类型与自定义类型成员变量的初始化 如果是编译器自动生成的默认构造函数对内置类型成员变量的初始化没有要求其值不确定。对于自定义类型的成员变量编译器会调用它们的默认构造函数进行初始化。 解释内置类型如int、char的成员变量如果没有显式初始化其值可能是未定义的。自定义类型的成员变量则必须通过其默认构造函数初始化。示例这里是初始化列表在这个系列的之后博客会讲到class MyClass { public:MyClass() : _value(0) { /* 初始化内置类型成员变量 */ } private:int _value;std::string _name;// 自动调用std::string的默认构造函数 }: 示例代码梳理 以下是展示上述特点的详细代码示例 这里只是为了方便写的示例哈如前文所述无参和全缺省的默认构造函数只能存在一种 #includeiostream using namespace std;class Date { public:// 1. 无参构造函数Date() {_year 1;_month 1;_day 1;}// 2. 带参构造函数Date(int year, int month, int day) {_year year;_month month;_day day;}// 3. 全缺省构造函数Date(int year 1, int month 1, int day 1) {_year year;_month month;_day day;}void Print() {cout _year / _month / _day endl;}private:int _year;int _month;int _day; };int main() {// 调用无参构造函数Date d1;// 调用带参构造函数Date d2(2025, 1, 1);// 调用全缺省构造函数Date d3;d1.Print();d2.Print();return 0; }通过这个详细的解析和示例代码我们可以清晰地理解C类的默认成员函数和构造函数的特点及其作用。这样开发者可以根据具体需求灵活地使用和自定义这些函数以便更好地控制对象的生命周期和资源管理。 3. 析构函数 析构函数是与构造函数功能相反的一个函数它用于在对象生命周期结束时释放资源。C中规定析构函数会在对象销毁时自动调用以完成对象中资源的清理工作。这一特性使得C能够有效地管理内存和其他资源防止资源泄漏。 1. 析构函数名 析构函数的名称是类名的前面加上一个“~”符号这是C语法中的规定。它用于明确表示该函数是析构函数。 解释析构函数的名字与类名相同但在前面加上“~”符号这使得编译器能够识别这是一个析构函数。示例class MyClass { public:~MyClass() {// 析构函数体} };2. 无参数无返回值 析构函数不接受任何参数也没有返回值。它的唯一任务是清理对象的资源。 解释由于析构函数是系统自动调用的因此它不能有参数也不需要返回任何值。示例class MyClass { public:~MyClass() {// 无参数无返回值} };3. 一个类只能有一个析构函数 每个类只能定义一个析构函数。如果类中没有显式定义析构函数系统会自动生成一个默认的析构函数。 解释C规定一个类只能有一个析构函数因为一个对象只能在生命周期结束时被销毁一次。示例class MyClass { public:~MyClass() {// 只能有一个析构函数} };4. 对象生命周期结束时系统会自动调用析构函数 当一个对象的生命周期结束如对象超出作用域或显式删除对象时系统会自动调用析构函数来清理资源。 解释析构函数的自动调用确保了对象在被销毁时可以正确地释放资源防止资源泄漏。示例class MyClass { public:~MyClass() {cout Object is being destroyed endl;} };int main() {MyClass obj; // 当obj超出作用域时系统会自动调用析构函数return 0; }5. 跟构造函数类似编译器自动生成的析构函数对内置类型成员不做处理 如果类中没有显式定义析构函数编译器会自动生成一个默认析构函数。这个默认析构函数对内置类型的成员变量不做任何处理。 解释对于内置类型如int、char等默认析构函数不需要释放资源。但对于自定义类型的成员编译器生成的析构函数会调用这些成员的析构函数。示例class MyClass { private:int _value; public:// 编译器自动生成的析构函数对内置类型不做处理 };6. 显式写析构函数情况 如果显式定义了析构函数对于自定义类型的成员变量它们的析构函数也会被自动调用。 解释当显式定义析构函数时C确保所有自定义类型的成员都会在对象销毁时调用其析构函数正确地释放资源。示例class MyClass { private:std::string _name; // 自定义类型成员 public:~MyClass() {// 自定义类型的成员变量会自动调用其析构函数} };7. 析构函数可以不写的情况 如果类中没有动态分配的资源或其他需要手动释放的资源可以不显式定义析构函数使用编译器生成的默认析构函数。 解释对于没有动态资源的类编译器生成的析构函数已经足够使用不需要额外的析构逻辑。示例class MyClass { private:int _value; // 没有动态资源编译器生成的析构函数已足够 };8. 一个局部域的多个对象C规定后定义的先析构 在一个局部作用域内定义的多个对象C规定后定义的对象会先调用析构函数。 解释这一规则确保了对象按照“后进先出”的顺序销毁符合栈的逻辑。示例class MyClass { public:~MyClass() {cout Destructor called endl;} };int main() {MyClass obj1;MyClass obj2;// obj2会在obj1之前被销毁return 0; }示例代码梳理 以下是完整展示上述析构函数特点的详细代码示例 #includeiostream using namespace std;typedef int STDataType;class Stack { public:Stack(int n 4) {_a (STDataType*)malloc(sizeof(STDataType) * n);if (_a nullptr) {perror(malloc申请空间失败);return;}_capacity n;_top 0;}~Stack() { // 自定义析构函数释放动态分配的内存cout ~Stack() endl;free(_a);_a nullptr;_top _capacity 0;}private:STDataType* _a;size_t _capacity;size_t _top; };// 两个Stack实现队列 class MyQueue { public:MyQueue() : pushst(), popst() {}// 默认析构函数自动调用两个Stack成员的析构函数// 显式定义的析构函数也会自动调用Stack成员的析构函数/*~MyQueue() {}*/private:Stack pushst;Stack popst; };int main() {Stack st;MyQueue mq; // MyQueue的析构函数会自动调用pushst和popst的析构函数return 0; }使用C实现的Stack解决括号匹配问题 #includeiostream using namespace std;bool isValid(const char* s) {Stack st;while (*s) {if (*s [ || *s ( || *s {) {st.Push(*s);} else {if (st.Empty()) {return false;}char top st.Top();st.Pop();if ((*s ] top ! [) ||(*s } top ! {) ||(*s ) top ! ()) {return false;}}s;}return st.Empty(); // 确保所有括号都匹配 }int main() {cout isValid([()][]) endl; // 输出1truecout isValid([(])[]) endl; // 输出0falsereturn 0; }通过上面的代码我们可以清楚地看到C的构造函数和析构函数帮助管理资源避免了手动调用初始化和清理函数的麻烦。C的这种自动化特性极大地简化了资源管理尤其是在动态内存管理的场景下。 4. 拷贝构造函数 拷贝构造函数是一种特殊的构造函数它用于通过已有对象来创建一个新的对象。在C中如果构造函数的第一个参数是自身类类型的引用并且任何额外的参数都有默认值那么这个构造函数就是拷贝构造函数。 1. 拷贝构造函数是构造函数的一个重载 拷贝构造函数实际上是构造函数的一种重载形式它与普通构造函数的区别在于其参数类型和目的。 解释拷贝构造函数的定义方式与普通构造函数类似但它的第一个参数必须是同类对象的引用用于创建新对象时进行对象的复制。示例class MyClass { public:MyClass(int value) { _value value; } { } // 普通构造函数MyClass(const MyClass other) { // 拷贝构造函数_value other._value;}private:int _value; };2. 拷贝构造函数的第一个参数必须是类类型对象的引用 拷贝构造函数的第一个参数必须是类类型的引用不能是传值因为传值会导致编译器不断调用拷贝构造函数最终引发无限递归导致编译错误。 解释通过引用传递对象可以避免不必要的拷贝操作并且能够直接访问原对象的内容。这种设计是为了防止调用拷贝构造函数时再次触发拷贝从而引发无限递归。示例class MyClass { public:MyClass(const MyClass other) { // 正确使用引用作为参数_value other._value;}// MyClass(MyClass other) { // 错误传值会导致无限递归// _value other._value;// }private:int _value; };3. C规定自定义类型对象进行拷贝时必须调用拷贝构造函数 在C中当自定义类型对象需要被拷贝时如传值传参或返回对象时系统会自动调用拷贝构造函数。这是C管理对象生命周期的一个基本机制。 解释无论是通过值传递一个对象还是从函数中返回一个对象C都会调用拷贝构造函数来创建新的对象副本。这确保了对象能够被正确地拷贝和初始化。示例void Func(MyClass obj) {// 传值调用自动调用拷贝构造函数 }MyClass ReturnObject() {MyClass temp(10);return temp; // 返回对象时自动调用拷贝构造函数 }int main() {MyClass obj1(10);MyClass obj2 obj1; // 调用拷贝构造函数Func(obj1); // 调用拷贝构造函数MyClass obj3 ReturnObject(); // 调用拷贝构造函数return 0; }4. 若未显式定义拷贝构造函数编译器会自动生成 如果类中没有显式定义拷贝构造函数编译器会自动生成一个默认的拷贝构造函数。这个默认的拷贝构造函数会对内置类型成员变量进行浅拷贝对自定义类型成员变量调用它们的拷贝构造函数。 解释编译器生成的默认拷贝构造函数能够满足大部分情况下的需求尤其是对于没有指针成员或动态资源的类。然而对于涉及动态分配的资源浅拷贝不合适需要自定义拷贝构造函数来实现深拷贝。如下会讲示例class SimpleClass { public:int _value;// 未显式定义拷贝构造函数编译器会生成默认的拷贝构造函数 };int main() {SimpleClass obj1;obj1._value 42;SimpleClass obj2 obj1; // 自动生成的拷贝构造函数return 0; }5. 编译器自动生成的拷贝构造函数对内置类型和自定义类型的处理 如果类成员全部是内置类型如int、char编译器自动生成的拷贝构造函数可以完成所需的拷贝无需显式定义。然而如果类成员包含指针或动态资源编译器生成的浅拷贝可能不合适需要自定义实现深拷贝。 解释浅拷贝只会复制指针的地址而不会复制指针所指向的数据。这在动态内存管理中可能导致多个对象共享同一块内存从而引发资源释放时的冲突。因此对于涉及动态内存的类通常需要自定义深拷贝构造函数。示例class Stack { public:Stack(int size) {_data new int[size];_size size;}// 自定义拷贝构造函数实现深拷贝Stack(const Stack other) {_data new int[other._size];//之后在内存管理会讲到_size other._size;for (int i 0; i _size; i) {_data[i] other._data[i];}}~Stack() {delete[] _data; // 析构函数释放资源}private:int* _data;int _size; };6. 拷贝构造函数在传值返回时的行为 当通过传值返回一个对象时会产生一个临时对象系统会调用拷贝构造函数来完成对象的复制。然而传引用返回不会调用拷贝构造函数而是返回对象的引用。 解释在C中通过值返回对象时编译器会调用拷贝构造函数来创建返回值的副本。如果通过引用返回对象则没有拷贝发生。然而引用返回需要确保返回的对象在函数结束后仍然存在否则会导致悬空引用。示例MyClass ReturnByValue() {MyClass temp(10);return temp; // 调用拷贝构造函数返回对象副本 }MyClass ReturnByReference() {static MyClass temp(10); // 使用static确保返回的引用有效return temp; // 返回引用不调用拷贝构造函数 }int main() {MyClass obj1 ReturnByValue(); // 调用拷贝构造函数MyClass obj2 ReturnByReference(); // 不调用拷贝构造函数return 0; }示例代码梳理 以下是展示上述拷贝构造函数特点的详细代码示例 #includeiostream using namespace std;class Date { public:Date(int year 1, int month 1, int day 1): _year(year), _month(month), _day(day) {}// 自定义拷贝构造函数Date(const Date d) {_year d._year;_month d._month;_day d._day;}void Print() const {cout _year - _month - _day endl;}private:int _year;int _month;int _day; };void Func1(Date d) {d.Print(); }Date Func2() {Date tmp(2024, 7, 5);return tmp; // 返回值传递调用拷贝构造函数 }int main() {Date d1(2024, 7, 5);Func1(d1); // 传值传参调用拷贝构造函数Date d2(d1); // 显式调用拷贝构造函数d2.Print();Date d3 d1; // 另一种形式的拷贝构造d3.Print();Date ret Func2(); // 调用拷贝构造函数ret.Print();return 0; }通过这些代码示例和解释我们可以深入理解C中拷贝构造函数的特性及其应用场景。这些知识点对编写高效、安全的C代码至关重要特别是在处理自定义类型和动态资源时掌握拷贝构造函数的用法可以有效防止潜在的错误和资源泄漏。 写在最后 在编写C代码时理解类与对象的这些核心概念不仅能够提升你的编程水平还能帮助你避免资源泄漏、内存管理错误等潜在的编程陷阱。通过掌握这些知识你将在编写面向对象的C代码时游刃有余。希望这篇博客能够成为你深入理解C类与对象的重要参考让你的C编程之旅更加顺畅、高效。如果你对这篇博客内容有任何疑问或希望进一步探讨的地方欢迎留言讨论我们一起学习进步 以上就是关于【C篇】C类与对象深度解析二类的默认成员函数详解的内容啦各位大佬有什么问题欢迎在评论区指正或者私信我也是可以的啦您的支持是我创作的最大动力❤️
http://www.dnsts.com.cn/news/227373.html

相关文章:

  • 企业网站推荐响应式网站难做
  • 重庆网站建设技术做贸易网站
  • 雄安网站建设400多少钱网站栏目规划叫什么
  • 网站的结构类型建站公司前景
  • 凡科专属网站免费注册南宁网站建设牛易飞
  • 免费网站制作视频教程企业做网站多少钱
  • 企业网站建立平台网站不备案会怎样
  • 做网站一年大概的盈利龙岗区
  • 在家没事做建什么网站好成都网站设计建设推荐
  • 潮阳网站制作自己做的网站用在博客上
  • 成都哪家网站建设做得好浙江金圣建设有限公司网站
  • 百度推广手机网站检测做购物网站 推广
  • 北关网站制作微信公众号链接网站开发
  • 兰州网站seo诊断html企业网站怎么做
  • 科技网站建设杭州比较有名的设计公司
  • wordpress多站点统计国外 电子 商务 网站 欣赏
  • 台州网站制作维护月夜直播免费完整版下载
  • 怎么建免费论坛网站如何申请网页域名
  • 可以做调查的网站wordpress获取分类文章
  • 网站制作与app开发哪个要难一点免费连接附近wifi
  • 三沙网站建设南京网站设计是什么
  • 如何重视企业网站的建设新华书店网站建设
  • 5000元做网站值么百度识别图片找图
  • 企业网站哪里可以做徐州制作网站的公司有哪些
  • 运营企业网站网站备案 失败
  • 电商网站项目经验介绍ppt模板沭阳哪里有做网站推广的
  • 做360全景有什么网站网站做流量推广的方式
  • 莆田网站建设开发郑州抖音代运营公司
  • 网站开发工作协议书范本app开发网上app开发
  • 优质校建设网站在线看crm系统