首页 > 其他分享 >[面向对象] 类

[面向对象] 类

时间:2024-06-09 23:54:37浏览次数:15  
标签:初始化 函数 静态 成员 面向对象 对象 构造函数

1. 类和对象

注意点:

  • (C++11之前)在类体中不允许对数据成员进行初始化

    class A {
        int a = 0;   // 在一些老版本的编译环境上会出错
    };
    
  • 类中的成员不能是自身类的对象

    否则会导致无限递归,最终栈溢出,因此会报编译错误。

    但是可以放自身类的指针或引用。

  • 若类A中含有成员类B,则类B需要提前声明

  • 数据成员不能用auto、register、extern修饰;成员函数不能用extern修饰


2. 拷贝构造函数

注意点:

  • 形参必须是对象的引用,&不能省略,否则会向上文所述的无限递归。

  • 编译构造优化

  • 要特别注意浅拷贝的问题

    举个例子

    class A {
        char* name;
        ~A() { delete[] name; }
    };
    

    当调用拷贝构造函数的时候,编译器会无脑复制一份数据到新对象,此时两个对象中name指向同一个地址,当两个类调用析构函数时,name会被delete两次,第二次会出错。

    这种情况必须自己写拷贝构造函数。

  • 对象作为参数传递时,用引用或者指针好一点,可以避免一次拷贝构造,减少开销


3. 静态成员

作用:为了解决同类对象间的数据共享问题,实际就是共享变量

静态成员在整个内存中只有一份,位于静态区。

在编译器遇到初始化语句时,就为其分配空间。

两种初始化方法:

  • 在类内初始化:必须加static修饰符
  • 在类内声明,要加static;在类外初始化,不加static

静态成员函数只能访问静态成员,因为非静态成员有对象才存在;相反,非静态成员函数可任意访问静态、非静态成员。在⼀般的成员函数中都隐含有⼀个this指针,⽤来指向对象自身,而在静态成员函数中没有this指针,这是无法访问非静态成员的技术原因。但是若向静态函数中传入对象,则可以访问对象中的非静态成员。

4. 友元

允许⼀个类授权另⼀个类的对象(友元类)、某个成员函数(友元成员)或外部函数(友元函数)访问其对象的非公有成员,而不允许整个程序访问。是类的封装性与执行效率的折中。

Java保留了静态成员,舍弃了友元机制。


5. 对象嵌套

比如类A中有成员变量类B,则在实例化A的时候,先调用B的构造函数,再调用A的构造函数(先里后外)

另外,在A的构造函数中,推荐使用构造函数初始化列表,来初始化B。

标签:初始化,函数,静态,成员,面向对象,对象,构造函数
From: https://www.cnblogs.com/laobei-uu/p/18240276

相关文章

  • 【JAVASE】面向对象编程综合案例--------模仿电影信息系统
    需求:(1)展示系统中的全部电影(每部电影展示:名称、价格)(2)允许用户根据电影编号(ID)查询出某个电影的详细信息。目标:使用所学的面向对象编程实现以上两个需求。代码:Movie.javaMovieOperator.javaTest.java代码运行;......
  • Java入门基础11:面向对象高级一(static、extends继承)
    Java面向对象高级特性有以下几个:继承,多态,封装,抽象,接口,匿名内部类,静态成员,final关键字,异常处理等。我会将它分为三章详细讲,本章主要讲静态和继承staticstatic叫静态,可以修饰成员变量、成员方法。类变量(静态成员变量):有static修饰,属于类,在计算机里只有一份,会被类的全部对象......
  • 【Rust】——面向对象设计模式的实现
     ......
  • Python中__面向对象__学习 (上)
    目录一、类和对象1.类的定义2.根据对象创建类二、构造和析构1.构造方法(1)不带参数的构造方法(2)带参数的构造方法2.析构方法三、重载1.定制对象的字符串形式(1)只重载__str__方法(2)只重载__repr__方法(3)重载__str__和__repr__方法2.运算符重载(1)加法运算重载(2)索引和分......
  • JAVA面向对象三大特征之继承
    目录1.继承概述2.继承的格式 3.继承的好处3.1继承的使用时机3.2注意4.继承中变量的访问特点5.总结1.继承概述在继承中我们可以把类分为两种一种是父类一种是子类,子类在继承父类后会获得父类中的属性和方法,在父类中定义过的属性和方法,子类中不需要再写一遍,同时子......
  • 07c/c++面向对象
    07C/c++零碎语法目录文章目录07C/c++零碎语法C1.封装2.继承3.多态C++4.1封装4.1.1封装的意义5.继承5.1继承的基本语法5.2继承方式5.3继承中的对象模型5.4继承中构造和析构顺序5.5继承同名成员处理方式5.6继承同名静态成员处理方式5.7菱形继承C1.封......
  • PTA--《面向对象程序设计》
    目录 一:超市贴花二:教师类三:快递计价器四:重复数据问题五:List的使用 一:超市贴花某超市有一种促销手段,购买金额超过一定阈值就随机给一个贴花。贴花有不同种类的,种类以编号表示,编号是一个1到100之间的数字。当收集到连续编号的三张贴花时,就可以换一个小礼物。输入样例......
  • 面向对象程序设计课程设计报告——计算器
    报告正文目录概述..............................................................................................................................................................1设计的基本概念和原理.............................................................
  • Python学习笔记四(面向对象)
    传送门python及pycharm安装配置-CSDN博客 Python学习笔记(一)-CSDN博客 Python学习笔记(二)-CSDN博客 Python学习笔记三(面向对象)-CSDN博客 目录一、继承1.1什么是继承题外话:多继承的问题1.2重写1.3super()函数1.3.1调用父类的方法1.3.2多重继承中的调用(硬核)1.3.3......
  • 面向对象设计方法Review-02.抽象数据类型
    结构化开发方法基本思想:自顶向下,逐步求精,过程抽象,模块化技术概念:结构化程序设计:按照一定的原则与原理,组织编写正确且易读的程序的软件技术。结构化分析设计:数据流图、数据字典、模块结构图。优势:合理性(管理复杂性的有效手段:分解,抽象,层次)、正确性(依据规约,完成任务)程序&......