C++:默认的构造函数

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

//例 3.10
#include<iostream>
using namespace std;
class Location{
 public:
    // Location()   //程序员自己设置的无参数(默认)的构造函数
    //   {
    //
    //   } 

       Location()   //程序员自己设置的无参数(默认)的构造函数
       {
         X = 0;
         Y = 0;
       }
       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(785,980);
 cout<<A.GetX()<<","<<A.GetY()<<endl;
 return 0;
}

//例3.11 关于计时器的例子

#include<iostream>
using namespace std;
class timer{
 public:
       timer() //无参数的构造函数,给seconds清0
       {
        seconds = 0;
       }
       timer(char *t)//含一个数字串参数的构造函数  char *t = "20"
       {
        seconds = atoi(t); //atio作用:把字符串转换成长整型数
       }
       timer(int t)//含一个整型参数的构造函数
       {
        seconds = t;
       }
       timer(int min, int sec)//含有两个整型参数的构造函数
       {
        seconds = min * 60+sec;
       }
       int gettime()
       {
        return seconds;
       }
 private:
       int seconds;
};
int main()
{
 timer a;  //创建类timer的对象a,调用无参的构造函数
 timer b(10);//创建类timer的对象b,调用含有一个整型参数的构造函数
 timer c("20");//创建类timer的对象c,调用含有一个数字串参数的构造函数
 timer d(1,10);//创建类timer的对象d,调用含有两个整型的参数的构造函数
 cout<<"seconds1="<<a.gettime()<<endl;
 cout<<"seconds2="<<b.gettime()<<endl;
 cout<<"seconds3="<<c.gettime()<<endl;
 cout<<"seconds4="<<d.gettime()<<endl;
 return 0;
}
//带默认参数的构造函数
#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 0;
}       

分析:在类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);
编译系统将无法判断应该调用哪个构造函数

时间: 2024-08-01 10:44:07

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

C++编译器合成默认构造函数的条件(合成默认拷贝构造函数雷同)

当用户没有为类定义构造函数的时候,编译器并不是为每个类合都成默认的构造函数,只是在编译器需要的时候才合成默认构造函数.编译器合成默认的构造函数只是满足编译器的编译的需要,而不是满足程序员的需要(例如,成员变量的初始化工作还需要程序员来定义构造函数). 1.对象中包含带有默认构造函数的对象 class A{ public: A(); } class B{ public: A a; } 在组合中B需要编译器合成默认的构造函数,来调用A的默认构造函数,来定义(并不帮助程序员初始化)B自己的成员变量,内

C++构造函数语意学——默认拷贝构造函数

概述 使用 class object 时,在以下三种情况会以一个 object 的内容作为另一个 class object 的初值,即用到拷贝构造函数: 定义一个 class object 并对其进行初始化: class object 作为一个参数传递给函数: class object 作为函数的返回值: 若用户没有显示声明或定义拷贝构造函数,则 C++ 在 必要 时为 class 声明或定义隐式拷贝构造函数,若出现以下的情况时,该拷贝构造函数是 trivial 的: their class h

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

1.2 当没有任何构造函数,java编译器,会插入一个默认的构造函数   (视频下载) (全部书籍) 见下面的例子: 本章源码 class Line {    double x = 0.02;    double y;} public class Test {    public static void main(String[] args) {        Line c = new Line();        System.out.println(c.x);        System.o

拷贝构造,深度拷贝,关于delete和default相关的操作,explicit,类赋初值,构造函数和析构函数,成员函数和内联函数,关于内存存储,默认参数,静态函数和普通函数,const函数,友元

 1.拷贝构造 //拷贝构造的规则,有两种方式实现初始化. //1.一个是通过在后面:a(x),b(y)的方式实现初始化. //2.第二种初始化的方式是直接在构造方法里面实现初始化. 案例如下: #include<iostream> //如果声明已经定义,边不会生成 class classA { private: int a; int b; public: //拷贝构造的规则,有两种方式实现初始化 //1.一个是通过在后面:a(x),b(y)的方式实现初始化 //2.第二种初始化的方式是直

C++对象模型之默认构造函数的构造操作

一个类,如果没有任何的用户声明的的构造函数,那么会有一个默认的构造函数被隐式地声明出来.这个被隐式声明的构造函数,究竟什么时候被合成.被编译器合成的默认构造函数究竟执行怎么样的操作,编译器如何处理用户定义的构造函数,就是本文要探讨的问题. 1.默认构造函数何时被合成 如果一个类没有任何的用户声明的构造函数,那么在当编译器需要的时候,编译器会为类合成一个默认的构造函数,它只用于执行编译器所需要的操作.注意,默认的构造函数是在编译器需要的时候被合成出来,而不是程序需要的时候,如果程序需要,则默认的构

默认构造函数

定义一个对象没有使用初始化表达式,就像下面的一样 Foo f1; Foo f2 = Foo(); Foo f2(); // 这个是错的,它声明了一个函数 就会调用默认构造函数(不带参数或者形参含有默认值),如果类没有定义构造函数,那么编译器会自动合成一个默认的构造函数. 如果类中定义了其他类型的构造函数,那么这个类是没有默认构造函数.

Swift 2.0学习笔记(Day 37)——默认构造函数

Swift 2.0学习笔记(Day 37)--默认构造函数原创文章,欢迎转载.转载请注明:关东升的博客 结构体和类的实例在构造过程中会调用一种特殊的init方法,称为构造函数.构造函数没有返回值,可以重载.在多个构造函数重载的情况下,运行环境可以根据它的外部参数名或参数列表调用合适的构造函数.默认构造函数结构体和类在构造过程中会调用一个构造函数,即便是没有编写任何构造函数,编译器也会提供一个默认的构造函数.下面看示例代码: class Rectangle { var width: Double

Swift—默认构造函数-备

结构体和类的实例在构造过程中会调用一种特殊的init方法,称为构造函数.构造函数没有返回值,可以重载.在多个构造函数重载的情况下,运行环境可以根据它的外部参数名或参数列表调用合适的构造函数.默认构造函数结构体和类在构造过程中会调用一个构造函数,即便是没有编写任何构造函数,编译器也会提供一个默认的构造函数.下面看示例代码:   class Rectangle { var width: Double  = 0.0 var height: Double = 0.0 } var rect = Recta

【C++】默认构造函数

参考文献: 1.黄邦勇帅 2.http://www.cnblogs.com/graphics/archive/2012/10/02/2710340.html 3.http://blog.csdn.net/pnhuangyu/article/details/12352073 分三个部分: 一.基础 二.什么时候需要默认构造函数 三.默认构造函数将成员初始化为了什么值 一.基础 1.没有参数的构造函数是默认构造函数,默认构造函数只有一个. 2.如果用户没有自己声明构造函数,C++将提供一个默认的构造