注意:如果类中用户没有定义构造函数,系统会自动提供一个函数体为空的默认构造函数。
但是,只要类中定义了一个构造函数(不一定无参构造函数),系统将不再给它提供
默认的构造函数。因为,默认的构造函数被类中的提供的构造函数给覆盖了。然而,
对象一建立,就需要初始化,所以,用户在程序中此时根据自己的需要来设置默认的
构造函数.....
//无参数的默认构造函数

//例 3.10
#include<iostream>
using namespace std;
class Location{
public:
// Location() //程序员自己设置的无参数(默认)的构造函数
// {
//
// } Location() //程序员自己设置的无参数(默认)的构造函数
{
X = ;
Y = ;
}
Location(int m, int n)
{
X=m;
Y=n;
}
void init(int initX,int initY)
{
X=initX;
Y=initY;
}
int GetX()
{
return X;
}
int GetY()
{
return Y;
}
private:
int X;
int Y;
};
int main()
{
Location A; //对象一建立,就会调用无参数(默认)的构造函数,进行初始化
A.init(,);
cout<<A.GetX()<<","<<A.GetY()<<endl;
return ;
} //例3.11 关于计时器的例子 #include<iostream>
using namespace std;
class timer{
public:
timer() //无参数的构造函数,给seconds清0
{
seconds = ;
}
timer(char *t)//含一个数字串参数的构造函数 char *t = "20"
{
seconds = atoi(t); //atio作用:把字符串转换成长整型数
}
timer(int t)//含一个整型参数的构造函数
{
seconds = t;
}
timer(int min, int sec)//含有两个整型参数的构造函数
{
seconds = min * +sec;
}
int gettime()
{
return seconds;
}
private:
int seconds;
};
int main()
{
timer a; //创建类timer的对象a,调用无参的构造函数
timer b();//创建类timer的对象b,调用含有一个整型参数的构造函数
timer c("");//创建类timer的对象c,调用含有一个数字串参数的构造函数
timer d(,);//创建类timer的对象d,调用含有两个整型的参数的构造函数
cout<<"seconds1="<<a.gettime()<<endl;
cout<<"seconds2="<<b.gettime()<<endl;
cout<<"seconds3="<<c.gettime()<<endl;
cout<<"seconds4="<<d.gettime()<<endl;
return ;
}
//带默认参数的构造函数
#include<iostream>
#include<cmath>
using namespace std;
class Complex{
public:
Complex(double r=0.0,double i=0.0); //在声明构造函数时指定默认参数值,初始化完成
double abscomplex();
private:
double real;
double imag;
};
Complex::Complex(double r,double i) //在类外定义构造函数时
{ real = r;imag = i;} //可以不再指定参数的默认值
double Complex::abscomplex()
{
double t;
t = real*real+imag*imag;
return sqrt(t);
}
int main()
{
Complex s1; //定义Complex类的对象s1,没有传递实参,全部用默认值
cout<<"复数1的绝对值是:"<<s1.abscomplex()<<endl;
Complex s2(1.1); //定义Complex类的对象s2,只传递一个实参
cout<<"复数2的绝对值是:"<<s2.abscomplex()<<endl;
Complex s3(1.1,2.2); //定义Complex类的对象s3,传递两个实参
cout<<"复数3的绝对值是:"<<s3.abscomplex()<<endl;
return ;
}

分析:在类Complex中,构造Complex的两个参数均含有默认参数值0.0,因此,在定义对象
时可根据需要使用其默认值,在主函数main中定义了3个对象s1、s2、s3,它们都是
合法的对象。由于传递的参数的个数不同,使它们的私有成员real和imag取得不同的
值。由于定义对象s1时,没有传递参数,所以real和imag均取得函数的默认值为其赋值
因此,real和imag均为0.0;由于定义对象s2时,只传递一个参数,这个参数传递给构造
函数的第一个形参,而第二个形参去默认值,所以,对象s2的real取得值为1.1,imag值
取得0.0;由于定义对象s3时,传递了两个参数,这两个实参分别赋给了real和imag取得
1.1,2.2。

运行结果 复数1的绝对值是:0
运行结果 复数2的绝对值是:1.1
运行结果 复数3的绝对值是:2.45967

拓展知识点:
1、如果构造函数在类的声明外定以,那么默认参数应该在类内声明构造函数原型时指定,
而不能在类外构造函数定义时指定。

2、如果构造函数的全部参数都指定了默认值,则在定义对象时可以指定一个或几个实参,
也可以不给出实参,这时的构造函数也属于默认构造函数

例如: Comolex(double r=0.0, double i=0.0);

因为类中只能有一个默认的构造函数,因此,不能同时再声明一个无参的
构造函数如下:
Complex();

原因:如果创建一个对象 Complex s1;
编译系统将无法识别应该调用以上那一个构造函数,产生了二义性

3、在一个类中定义了全部是默认参数的构造函数后,不能再定义重载构造函数。

例如:
在一个类中有以下构造函数的声明:
Complex(double r=0.0, double i=0.0); //声明全部是默认参数的构造函数
Complex(double r);

原因:如果定义一个对象 Complex s2(1.1);
编译系统将无法判断应该调用哪个构造函数

C++:默认的构造函数的更多相关文章

  1. 如何避免被C++默认拷贝构造函数忽悠?

    一.背景介绍           因为工作关系,需要用到C++编程.对于我来说,虽然一直从事的是linux平台下的嵌入式软件开发,但深入用到C++的特性的地方并不多.对于C++,用得最多的无非是指针. ...

  2. C++类的const成员函数、默认的构造函数、复制形参调用函数(转)

    C++类的const成员函数 double Sales_item::avg_price() const { } const关键字表明这是一个const成员函数,它不可以修改Sales_item类的成员 ...

  3. C++(1)C++类四个默认函数---构造函数、析构函数、拷贝函数、赋值函数

    C++构造函数和析构函数 默认构造函数指不带参数或者所有参数都有缺省值的构造函数!!! (1)构造函数.析构函数与赋值函数 构造函数.析构函数与赋值函数是每个类最基本的函数.它们太普通以致让人容易麻痹 ...

  4. C++ 默认拷贝构造函数 深度拷贝和浅拷贝

    C++类默认拷贝构造函数的弊端 C++类的中有两个特殊的构造函数,(1)无参构造函数,(2)拷贝构造函数.它们的特殊之处在于: (1) 当类中没有定义任何构造函数时,编译器会默认提供一个无参构造函数且 ...

  5. java中自动插入一个默认的构造函数,这到底怎么回事?

    1.2 当没有任何构造函数,java编译器,会插入一个默认的构造函数    见下面的例子: class Line {     double x = 0.02;     double y; } publ ...

  6. Autofac Getting Started(默认的构造函数注入)

    https://autofaccn.readthedocs.io/en/latest/getting-started/index.html The basic pattern for integrat ...

  7. [C++]默认构造函数

    默认构造函数(default constructor)就是在没有显示提供初始化式时调用的构造函数.它由不带参数的构造函数,或者为所有的形参提供默认实参的构造函数定义.若个定义某个类的变量时没有提供初始 ...

  8. 【C++对象模型】构造函数语意学之一 默认构造函数

    默认构造函数,如果程序员没有为类定义构造函数,那么编译器会在[需要的时候]为类合成一个构造函数,而[需要的时候]分为程序员需要的时候和编译器需要的时候,程序员需要的时候应该由程序员来做工作,编译器需要 ...

  9. Swift—默认构造函数-备

    结构体和类的实例在构造过程中会调用一种特殊的init方法,称为构造函数.构造函数没有返回值,可以重载.在多个构造函数重载的情况下,运行环境可以根据它的外部参数名或参数列表调用合适的构造函数.默认构造函 ...

随机推荐

  1. win7 64位下jboss配置

    1.下载Jboss7 下载地址:http://www.jboss.org/jbossas/downloads/ 2.解压到一个目录,如D:\Working,最终路径是D:\Working\jboss- ...

  2. jdbc连接数据库使用sid和service_name的区别

    问题描述: ORA-12505, TNS:listener does not currently know of SID given in connect descriptor The Connect ...

  3. 1093. Count PAT's (25)

    The string APPAPT contains two PAT's as substrings. The first one is formed by the 2nd, the 4th, and ...

  4. [转]Oracle学习记录 九 Prc C学习

    经过前面的了解,现在想用C语言来编程了,搜索了很多东西,后来决定先用Pro C来进行学习 在安装完Oracle数据库后就可以进行编程了,里面有一个命令proc就是对程序进行预编译的. 在这记一下,这是 ...

  5. hive 操作(转)

    1.命令行操作 (1)打印查询头,需要显示设置: set hive.cli.print.header=true; (2)加"--",其后的都被认为是注释,但 CLI 不解析注释.带 ...

  6. Hashmap in java

    1. HashMap要点: 1.1 基本数据结构:  采用 数组+链表/平衡二叉查找树 的组合形式,所有键值对都以Entry<K,V>形式存储(每put进一个键值对,就会实例化一个Entr ...

  7. 包装设计模式的实现以改进BufferedReader中的readLine方法为例

    实现与目标对象相同的接口     BufferedReader 定义一个变量记住目标对象 定义一个构造器接收被增强对象 覆盖需要增强的方法 对于不想增强的方法,直接调用目标对象的方法. package ...

  8. C++中的仿函数,std::function和bind()的用法

    1.仿函数:又叫std::function,是C++中的一个模板类 2.C语言中的函数指针: int  add(int a,int b) { return a+b; } typedef int (*f ...

  9. android开发,assets下面的资源文件不会变化/改动

    我再调试asserts下面的资源文件,发现我改动assets下面的文件内容,在真机上测试的时候还是最原先的内容,没有变,后来,卸载,重装就ok了. 原因: assets下面的资源文件,若覆盖重装,则里 ...

  10. UML: CIM & PIM

    CIM-1:定义业务流程 定义及分析业务流程(Business Process)是为了尽快理清系统范围,以便估算开发成本及时间,可不是为了要改造业务流程.系统分析员千万别误解了此步骤的目的.所以,系统 ...