大部分对象在使用之前没有正确的初始化是C++
出错的主要领域,引入类的构造函数是正确的初始化类的对象,一般什么时候触发并调用类的构造函数呢?
答案是:当我们用类来定义一个类变量的时候, 如:
class demo{.....}; 声明并定义好完整的类
//当我们用类去建立一个对象时,它首先调用类的构造函数
demo d; //调用类的无参数的构造函数
demo d1(参数1,..) //按参数个数不同,调用类中不同的构造函数
2.定义
构造函数名和类名完全一样,可以根据不同的参数来实现重载不同的构造函数
构造函数是没有任何返回值的,它默认的是public,inline函数
2.1定义格式
构造函数可以重载,可以是无参数,有参数,有默认参数)
声明三个构造函数
代码如下
class item{
public:
item(std::string& book=\"\" ); //带默认形参的构造函数
item(std::string& ); //带形参的构造函数
item(); //无形参的构造函数
};
2.2构造函数的两种初始化成员变量的方法
如下面的类
class demo(){
public:
//构造函数在下面添加
private:
int x;
int y;
std::string name;
};
构造函数初始化成员有两种方法
A
.使用构造函数的初始化列表进行初始化
格式:funname(参数列表):(初始化列表){}
初始化列表: 成员名1(形参名1),成员名2(形参名2),成员名n(形参名n)
代码:
demo(int a=0,int b=0,std::string s=\"\"):x(a),y(b),name(s){}
B
.使用构造函数的函数体进行初始化
格式:funname(参数列表){函数体内赋值}
它和传统的C函数差不多
代码:
demo(int a=0,int b=0,std::string s=\"\"){
x=a;
y=b;
name=s;
}
3.基类与派生类
3.1在基类用构造函数初始化类的成员
\"默认形参的方式+初始化列表\"来初始化基类,而参数顺序不是主要的
代码如下:
class item_base(
public:
//两个构造函数
item_base():(isbn(\"\"),price(0.0){}
item_base(std::string& book=\"\",double s_price=0.0) //带默认形参
:isbn(book),price(s_price){} //初始化列表
......
private:
std::string book;
double price
);
3.2派生类
由于初始化顺序是从基类到派生类的
基类的构造函数负责初始化基类与派生类的构造数负责初始化派生类,
在MFC中N层继承类库中,都是不同层中的类负责初始化自己本身和调用上一级构造函数进行初始化
如何在派生类初始化从基类中继承来的protected成员和基类的private成员呢?
答案是:
在派生类的构造函数间接的调用基类构造函数来实现,派生类的初始化列表必须明确指出基类的初始化式
[Page]
1.无参数的构造函数
格式:构造函数名():(基类构造函数(),派生类成员d1(值),d2(值),n(值){}
2.有参数的构造函数
格式:
构造函数名(基类参数...派生类参数...)
:(基类构造(b1(参数),b2(参数)),派生类成员d1(参数),d2(参数),n(参数){}
class bulk_item: public item_base{
public:
//1.派生类无参数的构造函数
bulk_item():(item_base(),int_qty(0),discount(0.0){}
//2.派生类有参数的构造函数
bulk_item(std::string& book=\"\",double s_price=0.0,int qty=0,double dis=0.0)//函数参数
:item_base(book,s_price),int_qty(0),discount(0.0){} //初始化列表
private:
int min_qty;
double discount;
};
4.设计指导
4.1初始化方式选择:
无参数的构造函数:主要用初始化列表来初始化成员变量
有参数的构造函数:默认形参+初始化列表的构造函数
4.2派生类的初始化顺序
由于初始化顺序是从基类到派生类的,在初始化列表中应该先初始化基类,然后再是派生类本身
如果要求程序高性能,使用初始列表是C++
的生产首选,对于习惯于C的程序员,在函数体初始化成员也是可行。
分享到:
相关推荐
C++中的类构造函数是类的一个特殊成员函数,它的主要任务是对类的对象进行初始化。构造函数的名字与类名相同,且没有返回类型。当我们声明一个类的对象时,编译器会自动调用相应的构造函数来分配内存并初始化对象的...
### C++ 类的定义与构造函数 #### 一、类的基本定义 在C++中,类是一种用户自定义的数据类型,它将数据(成员变量)和操作这些数据的方法(成员函数)封装在一起。类的定义通常形式如下: ```cpp class ClassName {...
C++中一般创建对象,拷贝或赋值的方式有构造函数,拷贝构造函数,赋值函数这三种方法。下面就详细比较下三者之间的区别以及它们的具体实现 1.构造函数 构造函数是一种特殊的类成员函数,是当创建一个类的对象时,它...
C++ 类构造函数详解 C++ 类构造函数是 C++ 编程语言中的一种特殊成员函数,用于初始化类对象的数据成员。下面将详细介绍 C++ 类构造函数的种类、作用和使用方法。 1. 构造函数的作用 构造函数的主要作用是初始化...
本文将详细解析一个简单的C++类`cPerson`的实现,重点关注其构造函数、析构函数以及拷贝构造函数。 ### 构造函数 构造函数是在创建类的对象时自动调用的一种特殊成员函数,主要用于初始化对象的数据成员。`cPerson...
C++类构造函数初始化列表是创建对象时执行成员变量初始化的一种机制,它的主要作用在于确保对象的成员变量在构造函数的执行体之前被正确初始化。初始化列表以冒号开始,随后列出成员变量及其对应的初始化表达式,每...
拷贝构造函数是C++类的一个重要特性,它涉及到类对象之间的复制。当我们谈论“C++规定与类同名的函数就是拷贝构造函数”时,实际上是指一个类中定义的与类名相同且参数为该类类型的函数,这就是拷贝构造函数。 拷贝...
在C++编程语言中,复制构造函数是一种特殊的构造函数,它的主要作用是创建一个对象的新副本。当一个已存在的对象被用作创建新对象的初始值时,复制构造函数会被调用。理解复制构造函数的工作原理及其应用是C++程序员...
构造函数与析构函数是C++编程语言中非常重要的概念,它们在类的实例化和销毁过程中扮演着关键角色。通过理解这些函数的工作原理及其作用,我们可以更好地控制对象的生命周期,确保资源得到妥善管理。 #### 构造函数...
C++ 默认构造函数是编程语言C++中一个关键的概念,主要涉及到类的实例化和对象初始化。当程序员没有显式地定义任何构造函数时,C++编译器会自动为类提供一个默认构造函数,这个构造函数是无参数的,其主要任务仅仅是...
C++类和对象练习 构造函数 复制构造函数 缺省参数列表
在C++编程中,"通讯录 c++ 构造函数 类"这一主题涉及到对象导向编程中的核心概念,如类的设计、构造函数的使用以及数据成员和成员函数的管理。下面将详细解释这些知识点: 1. **类(Class)**: 类是C++中的一个...
Sprite类还包含了一个复制构造函数和一个赋值运算符重载,这在C++中用于支持复制语义,确保对象复制的正确性。赋值运算符重载在复制对象时被调用,用于处理对象之间的赋值操作,其目的是避免浅拷贝带来的问题,确保...
在C++编程语言中,拷贝构造函数是一个特殊类型的构造函数,它的主要作用是初始化一个新对象为已存在对象的副本。这个过程被称为浅复制或深复制,具体取决于类的成员变量类型。对于初学者来说,理解拷贝构造函数的...
在C++编程语言中,构造函数是类的一个特殊成员函数,它的主要职责是初始化新创建的对象。当一个类有多个构造函数,每个函数具有不同的参数列表时,我们称这种情况为构造函数的重载(Overloaded Constructors)。这种...
构造函数初始化列表是C++中一个非常重要的特性,它允许程序员在对象创建时直接对类中的成员进行初始化,而不是先分配内存再赋值,这在效率和安全性上都有显著优势。 #### 构造函数初始化列表的作用与语法 构造函数...
在C++编程语言中,构造函数是类的一个特殊成员函数,它的主要作用是初始化新创建的对象。构造函数的名称与类名相同,且没有返回类型。在这个实例中,我们看到了两种不同类型的构造函数:无参数构造函数和带有参数的...
在上述`Derived`类的例子中,`Derived()`构造函数的主体部分就是派生类构造函数的执行阶段。 总结来说,C++对象构造的顺序是: 1. 按照声明顺序初始化成员对象的构造函数。 2. 调用基类的构造函数(如果有的话)。 ...
2. 派生类构造函数的形式:派生类的构造函数可以有多种形式,但通常包括基类构造函数的调用。这可以通过在派生类构造函数的初始化列表中指定基类构造函数来实现。例如: ```cpp class Derived : public Base { ...