C++面向对象编程之——构造函数(二)

C++之面向对象、构造函数、析构函数 阅读详情

接着上一节,继续总结构造函数,主要涉及到C++11中的委托构造函数,以及一些关于构造函数的常见面试题。


目录

  1. 默认构造函数的作用
  2. 委托构造函数
  3. 构造函数常见的面试题

默认构造函数的作用

当对象被默认初始化或值初始化时自动执行默认的构造函数。默认初始化在以下情况下发生:

  • 当我们在块作用域内不使用任何初始值定义一个非静态变量或者数组;

  • 当一个类本身含有类类型的成员且使用合成的默认构造函数时;

  • 当类类型的成员没有在构造函数初始值列表中显示初始化。

 

而值初始化在以下情况下发生:

  • 在数组初始化的过程中如果我们提供的初始值数量少于数组大小时;

  • 当我们不使用初始值定义一个局部的静态变量;

  • 当我们通过书写形如T()的表达式显示请求值初始化时,其中T类型,形如vector的一个构造函数只接受一个实参用于说明vector的大小;

使用默认构造函数

	Sales_data obj1();   //声明一个函数而非对象
	Sales_data obj;       //声明一个对象

定义使用默认的构造函数进行初始化的对象,Sales_data obj; 其中obj是一个默认初始化对象。

委托构造函数

C++11新标准中扩展了构造函数初始值的功能,定义了所谓的委托构造函数。委托构造函数使用它所属的类的其他构造函数执行它自己的初始化过程,或者说它把它自己的一些或全部指责委托给其它的构造函数。如:

struct Sales_data
{
	//非委托构造函数
	Sales_data(const std::string &s, unsigned n, double p) :  //三个参数
		bookNo(s), units_sold(n), revenue(p*n) {}
	//其余构造函数全都委托给另一个构造函数
	Sales_data():Sales_data(" ", 0, 0) {}; //默认的构造函数委托给三个参数的构造函数 
	Sales_data(const std::string &s) :Sales_data(s,0,0) {}//一个参数委托构造函数三个参数的构造函数
	Sales_data(std::istream &is):Sales_data() //将委托给默认的构造函数
	{
		read(is, *this);
	}

	std::string isbn() const { return bookNo; }//常量成员函数,不能修改对象内容
	Sales_data& combine(const Sales_data&);//double avg_price() const; 

	std::string bookNo;
	unsigned units_sold = 0;
	double revenue = 0.0;
};

程序中默认的构造函数和一个参数的构造函数委托给三个参数的构造函数,而接受istream &参数的构造函数又委托默认的构造函数。其中委托顺序下图所示。

 


构造函数常见的面试题

构造函数能否为虚函数?

构造函数不能为虚函数。因为虚函数采用的是一种虚调用的方法,而虚调用是一种可以在只知道部分信息的情况工作机制,特别允许我们调用一个只知道接口而不知道准备对象类型的函数。但是,创建一个对象,你势必要知道对象的准确类型,因此构造函数不能为虚函数。

构造函数是否为内联函数?

构造函数可以在类内或类外,如果构造函数位于类内部,就是内联函数;若在类外,并且没有inline关键字,就一定不是内联函数,如果在类外有关联字(inline),只能说建议编译器将此函数设为内联函数,至于最终是不是内联函数由编译器决定。内联函数是编译时展开,并做类型安全检查。

 

C++面向对象编程<二>:构造函数 前置声明 class complex;类的前置声明只是告诉将类的名称编译器,并未提供class的任何其他信息,因此前置声明使我们得以使用类的指针和引用,而不能使用类的对象,如下complex *p = 0; //定义一个类指针(class pointer) void func(const complex& ); //以complex作为数据型别但这样用就会出错complex obj; 头文件声明 阅读详情

相关推荐

vmware vsphere 证书过期告警处理方法

vSphere Clinet 管理页面出现“证书告警” ,检查证书未发现现有证书有过期现象

m0_51902127的博客 3640

C++面向对象基础-构造函数

存在,当成员变量出现指针类型时,默认的拷贝构造函数会导致两个对象的成员变量指向同一处,改变一处另一处也会改变不符合面向对象的设计规范,这种现象被称为”浅拷贝“。如果我们有一个默认构造函数,编译器不会创建默认构造函数,会创建拷贝构造函数。如果我们有一个有参构造函数,编译器不会创建默认构造函数,会创建拷贝构造函数。创建有参构造函数,编译器不会创建无参构造函数,会创建拷贝构造函数。创建无参构造函数,编译器不会创建无参构造函数,会创建拷贝构造函数。手动添加构造函数,编译器就不会自动添加构造函数。

m0_74937538的博客 755

RDMA学习笔记-IB五层网络协议和报文结构

Reference InfiniBand Architecture Specification Volume 1, Release 1.3 文章目录IBA 网络协议分层1.链路层1.1 LRH1.2 ICRC1.3 VCRC2.网络层(GRH)3.传输层3.1 BTH3.2 extended transport header4. 报文结构4.1 send request4.2 RDMA Write request4.3 RDMA Read request4.4 ACK4.5 Atomic operatio

u014114310的博客 9476

C++ 面向对象基础-构造函数

构造函数,构造函数进行初始化赋值,函数默认值。 拷贝构造函数,浅拷贝与深拷贝。 析构函数。 构造函数是一种特殊的成员函数,用于创建对象时初始化。

weixin_67273669的博客 899

TwinCAT3 主站动态配置 PDO 的实战技巧与性能优化

本文深入探讨了TwinCAT3主站动态配置PDO的实战技巧与性能优化策略。通过对比静态PDO的局限,阐述了动态配置在提升系统灵活性、降低网络负载和保障实时性方面的核心优势。文章提供了从环境准备、代码实现到错误排查的完整流程,并重点解析了PDO映射、SDO通道区别以及分布式时钟同步等关键概念,帮助工程师掌握EtherCAT网络性能调优的核心方法。

weixin_29213525的博客 346

从MC到DC:三维重建算法的核心原理与实战对比

本文深入对比了三维重建领域两大经典算法Marching Cubes(MC)与Dual Contouring(DC)的核心原理与实战表现。MC算法原理直观、实现简单,但存在特征丢失和二义性问题;DC算法通过求解二次误差函数(QEF)和利用法向量信息,能更好地保留模型的尖锐特征,但计算更复杂。文章结合医学影像处理实例,为开发者根据速度、精度和特征保真度需求选择合适算法提供了清晰指南。

weixin_29251131的博客 1037

C++面向对象程序设计——构造函数

一、问题引入:数据成员初始化 对数据成员进行初始化 方法1: ClassTime {public: Hour; Minute; Sec; }; Time T1={14,56,30}; 这种初始化方法仅用于对象的成员均为public的情况。如果数据成员是私有的,或者类中有private或protected的数据成员就不能用这种方法进行初始化 方法2: 用成员函数对对象中的数据成员赋初值。 二、构造函数概述 构造函数的定义 不需要用户来调用他;,而是在建立对...

m0_54587903的博客 1586

VS2019+CAXACAD2023二次开发教程(一、环境搭建)

CAXACAD2023的二次开发相关文件和库都在的文件夹下。CAXACAD2023的默认开发环境是VS2019,如果是用VS2019的环境话,可以直接安装这个插件,安装好后就可以一键新建的项目,新建的项目会自动帮我们配置好所有的环境,并且生成必要的代码和初始的框架。(本来想用VS2022的,但配置环境太麻烦,用VS2022,增加一个环境变量是可以运行自带的例程的,但新建项目要配置的东西和环境太多,就放弃折腾了)

weixin_42968757的博客 4627

C++学习之路—面向对象—构造函数

C++面向对象之构造函数定义构造函数的用途使用构造函数有几点需要注意 定义 构造函数也叫构造器,在对象创建的时候自动调用,一般用于完成对象的初始化工作 下方示例中Person()就是类的构造函数 class Person { public: Person();//创建类时自动创建的构造函数,也可以手动添加,这个为构造函数的声明 ~Person();//虚构函数,后续文章会记录 int m_member; private: }; Person::Person()//构造函数的实现-无参数构造

weixin_45452278的博客 1411

【Lua面试】2021年Lua面试题分享(4.25更新)

lua深拷贝和浅拷贝的区别?如何实现深拷贝? lua中ipairs和pairs的区别? 链接: link.

qq_21407523的博客 2万+

Cesium功能集(十二):Cesium中流体仿真

【代码】Cesium功能集(十二):Cesium中流体仿真。

GIS肆月 603

C++面向对象编程入门:构造函数与析构函数(二)

 出处:PConline     作者:管宁      责任编辑:xietaoming下面我们来看一个带参数的构造函数是如何进行对象的始化操作的。   代码如下:#include iostream>  using namespace std;    class Teacher  {      public:      Teacher(char *input_name)//有参数的构造函数 

Q_Jizi(七之子)的专栏 1045

YOLOv11改进策略【模型轻量化】| 使用 MoblieOne 模块,引入结构重参数化,提高模型检测效率

本文记录的是基于MobileOne的YOLOv11骨干网络改进方法研究。MobileOne的基础模块通过重参数化,。在将其替换YOLOv11的骨干网络后,实现模型轻量化。

Limiiiing的博客 1427

【c++面向对象编程】第3篇:类与对象(二):构造函数与析构函数

上一篇我们定义了类,但每个对象创建后还要手动调用setXxx()来初始化,对象销毁前也没机会做清理。构造函数和析构函数解决了这两个问题——它们是被自动调用的特殊函数。构造函数在对象诞生时执行,适合做初始化(分配内存、设置初值);析构函数在对象消亡前执行,适合做清理(释放资源、关闭文件)。理解它们的调用时机和规则,是写出健壮C++代码的基础。

2301_80672009的博客 709

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

【c++面向对象编程】第12篇:继承(二):构造与析构顺序,继承中的构造函数

当一个类继承自另一个类,派生类的对象内部会包含一个基类的“子对象”。这个子对象如何构造?派生类的构造函数如何向基类传递参数?构造和析构的顺序是怎样的?这些问题如果不搞清楚,很容易写出编译错误或隐藏的资源泄漏。本篇讲清楚继承体系下的生命周期管理,让派生类对象“出生”和“死亡”的过程完全透明。

2301_80672009的博客 397

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

C++构造函数的各种用法全面解析(C++初学面向对象编程)

类和对象是 C++ 的重要特性,它们使得 C++ 成为面向对象的编程语言。在C++类的学习当中,有一个用来初始化成员数据的函数即构造函数,本文重点分析的就是构造涵的各种用法和注意事项。

Viewinfinitely的博客 5万+

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

C++ 面向对象编程揭秘(二)

在本节中,我们将介绍核心面向对象的概念以及适用的术语,这些术语将伴随着这些关键思想。虽然本章中会出现新术语,但我们将从必须理解的术语开始,以便在本节开始我们的旅程。面向对象的系统因为封装和信息隐藏,因此更容易维护。用户定义类型的升级和修改可以快速进行,而不会对整个系统产生影响。让我们从基本的面向对象术语开始。在本章中,我们已经开始了面向对象编程的旅程。我们学习了许多面向对象的概念和术语,并看到了 C++如何直接支持实现这些概念。

龙哥盟 1035

【C++面向对象编程】概述

C++面向对象编程通过类、对象、封装、继承和多态等特性,实现了代码的高内聚、低耦合。掌握这些技术不仅能提升开发效率,还能构建更健壮、可维护的软件系统。

byte轻骑兵的技术小窝 1576

深入浅出C++面向对象编程

封装将数据(成员变量)和操作数据的函数(成员函数)绑定在一起,并通过访问修饰符(public、protected、private)对外部进行数据隐藏。继承允许新类(派生类)基于已有类(基类)构建,重用、扩展或修改基类的行为。

2301_77034008的博客 8879

【C++】C++中的构造函数和析构函数详解

本篇主题为:C++中的构造函数和析构函数详解写在前头:本篇会从类的六个默认成员函数开始,进入构造函数和析构函数的研究。

cilmy23的note 7845

如何掌握C++面向对象编程:CPP-Crash-Course终极指南

面向对象编程(OOP)是C++语言的核心特性,也是从C程序员成功转型为C++开发者的关键所在。CPP-Crash-Course项目为C程序员提供了一个完整而实用的C++速成教程,特别专注于**C++类与对象**的深度解析。本文将带你深入了解这个优秀的开源项目,掌握C++面向对象编程的核心概念和实践技巧。 ## 📚 CPP-Crash-Course项目概述 CPP-Crash-Course是一

gitblog_00023的博客 555

C++面向对象编程思想

指向对象的指针是指一个指针变量,它存储了一个对象的内存地址。通过这个指针,我们可以间接地访问和操作该对象。在 C++ 中,可以使用指针来引用或指向一个对象。指针变量存储了对象在内存中的地址,通过解引用指针,我们可以访问指针所指向的对象的成员变量和成员函数。// 创建一个 MyClass 对象// 创建指向 MyClass 对象的指针,将其指向 obj 的地址在这个例子中,ptr 是一个指向 MyClass 对象的指针,它存储了 obj 对象的地址。

weixin_41289611的博客 1930

C++面向对象编程:从基础到实战

本文介绍了C++面向对象编程(OOP)的基础概念,重点讲解了类和对象的定义与使用。内容包括:类声明与实现、封装与访问控制(private/public/protected)、构造函数与析构函数、拷贝构造函数与赋值运算符重载等核心知识点。通过学生类(Student)、个人类(Person)和矩形类(Rectangle)等示例代码,展示了如何定义类成员变量和成员函数,以及对象的创建和使用方法。文章还解释了面向对象编程的封装特性,并提供了详细的代码说明,帮助读者理解C++中类与对象的基本原理和实现方式。

今天比昨天更努力一点! 1万+

C++——面向对象编程

上次学C++还是本科,似乎鄙人和C++也有七年之痒,她藏在大脑最深处,不知在哪儿,如今书到用时才恨少啊。

知识,既贵,又便宜。 1870

【小白学习C++ 教程】十二、C++面向对象编程中的构造函数和析构函数

@Author:Runsen 面向对象编程旨在:在编程中实现继承、隐藏、多态等现实世界的实体。OOP 的主要目的是将数据和对它们进行操作的函数绑定在一起。 我们可以说C++中的类,代表一组共享一些共同属性和行为的对象。 class person { char name[20]; int id; public: void getdetails(){} }; int main() { person p1; // p1 is a object } 构造函数 构造函数是特殊的

微信号:RunsenLiu 1421

c++面向对象编程

面向对象编程的几个重要概念:类&对象,封装、继承、多态、抽象

qq_45592093的博客 1990
上一篇: C++面向对象编程之——构造函数(一)
下一篇: 《剑指offer》之——单链表的翻转
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值