首页 > 编程语言 >C++_C++对象初始化

C++_C++对象初始化

时间:2024-12-10 17:22:06浏览次数:8  
标签:初始化 调用 函数 对象 C++ 析构 构造函数

类定义

 有两种方式:
       一是在类内声明时同时实现,
    另一种是在类内声明函数原型、在类外实现
    
     类内定义的成员函数默认为内联函数
 	类外实现减少编译依赖 减少编译依赖并清晰地分离接口与实现

初始化

显式初始化和隐式初始化	

声明 定义 初始化  --初始值的来源
    单个变量而言,初始化表示现在创建一个新的变量,它的初始值来自一个已经存在的对象,即原来没有值,现在第一次给它一个初值就叫初始化	
	              赋值是两个变量已经有值的情况下,将一个变量值去替换另一个变量值
	类对象:
	     类对象的拷贝初始化 是调用 拷贝构造函数来完成的
		 类对象的赋值操作   是调用类的拷贝赋值运算符 说“=”运算符  进行了重载
先定义再赋值
定义的同时赋值

拷贝初始化 看起来像是给变量赋值,实际上是执行了初始化操作
初始化器列表构造函数初始化(initializer-list constructor)
成员初始器列表(constructor initialize list)以一个冒号开始,接着是以逗号分隔的数据成员列表,每个数据成员后面跟一个放在括号中的初始化式

变量 
  内置类型变量(如int,double,bool等),
          如果定义在语句块外(即{}外),则变量被默认初始化为0;
          如果定义在语句块内(即{}内),变量将拥有未定义的值。
对象:
   对象初始化是创建对象并为其分配内存空间的过程
     两个步骤:分配内存和构造对象	
        分配内存是指为对象分配所需的内存空间,
		而构造对象是指初始化对象的成员变量和调用构造函数。		 

    编译器自动调用构造函数进行隐式初始化。
     对象的生命周期取决于它的作用域和存储方式
	 
动态分配内存的方式(即不采用new运算符)	 
初始化器(即使用了圆括号或花括号
直接初始化与拷贝初始化


当创建一个无名临时对象  创建一个有名称的对象 
    T();
   T{};
   new T();
   new T{};	

析构函数

何时调用析构函数: 
 1.对象生命周期结束时,会自动执行析构函数。
   析构函数不返回任何值,没有返回类型,也没有函数参数。由于没有函数参数,因此它不能被重载。
  换言之,一个类可以有多个构造函数,但是只能有一个析构函数。
 2.如果用new运算动态地建立一个对象,那用delete运算符释放该对象时,才会调用析构函数
 3.广义上讲,析构函数的作用并不仅仅限于释放资源方面,它可以执行任意操作,
   用来执行“对象即将被撤销之前程序员所期待的任何操作。

三个成员函数缺一不可:析构函数、复制构造函数、赋值运算符
   原因:普通构造函数是通过赋值操作来初始化,就会有可能存在生成临时成员对象的问题

构造函数-python 比较

python:构造函数(Constructor)
   在Python中,构造函数的名称是__init__  构造函数在类实例化时自动执行
   根据需求创建适合的构造函数来初始化对象的属性
   
    必须包含参数self作为第一个参数,self参数是一个指向实例本身的引用,用于访问类中的属性和方法
  Python认为子类和父类是同等的对象,
   只是子类继承父类后,会保留父类的方法和成员,是否覆盖取决于他自己
     派生类调用基类,则是在派生类中使用super().__init__()
	成员函数需要被手动调用,而构造函数在创建对象的过程中是自动被调用的 
	同一个对象而言,成员函数可以被调用多次,但是,构造函数只能被调用一次

C++  C++中的先调用父类初始化再调用子类初始化方法的现象。
    C++认为子类是父类生的,所以父类必须存在而且先存在

参考

标签:初始化,调用,函数,对象,C++,析构,构造函数
From: https://www.cnblogs.com/ytwang/p/18597709

相关文章

  • 11C++循环结构-for循环(1)
    一、for语句引出问题:当需要重复执行某一语句时,使用for语句。for语句最常用的格式为:for(循环变量赋初值;循环条件;循环变量增值)语句;注:“语句;”就是循环体,可以是一个简单的语句,也可以是一个用“{}”括起来的复合语句。它的执行过程如图示:编写这个程序可以如此:#include......
  • SpringBoot+logback 日志打印脱敏,正常获取对象不受影响
    添加依赖注意:springboot版本2.7.0<dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>1.7.36</version></dependency><......
  • 【android】如何在Android head中获取Android.Content.Context对象
    在Android头部中获取Android.Content.Context对象,可以通过以下方法实现:通过Activity的getContext()方法获取Context对象:通过Activity的getContext()方法获取Context对象:通过View的getContext()方法获取Context对象:通过View的getContext()方法获取Context对象:通过Application......
  • C++_线程池解读-线程和调试以及构建
    C++11多线程相关的头文件C++11新标准中引入了四个头文件来支持多线程编程,他们分别是<atomic>,<thread>,<mutex>,<condition_variable>和<future>作用:线程池这层封装,只需要告诉它开启几个线程,然后直接塞任务就行了,然后通过一定的机制获取执行结果线程池可以想象成......
  • C++天使的灵动心跳代码:类和对象(中下)
    文章目录4.拷贝构造函数4.1默认拷贝构造函数4.2显式调用拷贝构造函数5.运算符重载函数5.1赋值运算符重载函数5.1.1默认赋值运算符重载函数5.1.2显式调用赋值运算符重载函数5.2const取地址运算符重载函数希望读者们多多三连支持小编会继续更新你们的鼓励就是我......
  • 蓝桥杯历届真题 -- #错误票据 (C++)
    文章目录思路stringstream接收数据完整代码结语原题连接思路我们将数据拿到数组之后,对数组进行一个排序,然后从头到尾遍历数组,在遍历的过程中,依次比较当前位置上的数字和上一个位置上的数字如果a[i]=a[i-1],说明是重复的号码如果a[i]=a[i-1]+2,说明是断号stringstr......
  • C#中通过ObjectPool重用对象提高程序性能
    环境说明:.NET8.0Microsoft.Extensions.DependencyInjectionv9.0.0Microsoft.Extensions.ObjectPoolv9.0.0ObjectPool重用对象先看微软官方文档的描述:Microsoft.Extensions.ObjectPool它支持将一组对象保留在内存中以供重用,而不是允许对对象进行垃圾回收如果要管理的对......
  • 这么回答Java对象创建过程, 面试官给我一个赞
    一、对象的组成对象的组成包含三部分:对象头、实例数据、对齐填充。1.对象头Java的对象头由以下三部分组成:MarkWord、指向类的指针、数组长度(只有数组对象才有)①MarkWordMarkWord包含:哈希码、GC分代年龄、锁标识状态、线程持有的锁、偏向线程ID(一般占32/64bit)。Mar......
  • 2024年第七届全国青少年人工智能创新挑战赛 编程创作与信息学专项赛 C++真题(第一场)
    田地移动【问题描述】童童的田地是一个n行n列的格子方阵,区域中有一些格子埋有种子,用字符*表示,其他格子没有种子,用字符?表示。某一天童童在田地地里播种,他可以根据指令在上下左右四个方向上移动,大写字母A、B、L、R分别表示向上、向下、向左、向右移动一格。现在输入田......
  • 第二章:信息建模:对象、变量和方法的 ModelParent
    推荐一个功能丰富的OPCUA客户端应用程序,可用于连接任何OPCUA服务器。您可以浏览服务器地址空间、读取和写入数据以及调用方法。下载地址:OPCUA客户端模拟器 对象、变量和方法的ModelParent #像HasComponent这样的ReferenceTypes可以很好地指示所引用的组件包......