C++:默认的构造函数
注意:如果类中用户没有定义构造函数,系统会自动提供一个函数体为空的默认构造函数。
但是,只要类中定义了一个构造函数(不一定无参构造函数),系统将不再给它提供
默认的构造函数。因为,默认的构造函数被类中的提供的构造函数给覆盖了。然而,
对象一建立,就需要初始化,所以,用户在程序中此时根据自己的需要来设置默认的
构造函数.....
//无参数的默认构造函数
//例 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++:默认的构造函数的更多相关文章
- 如何避免被C++默认拷贝构造函数忽悠?
一.背景介绍 因为工作关系,需要用到C++编程.对于我来说,虽然一直从事的是linux平台下的嵌入式软件开发,但深入用到C++的特性的地方并不多.对于C++,用得最多的无非是指针. ...
- C++类的const成员函数、默认的构造函数、复制形参调用函数(转)
C++类的const成员函数 double Sales_item::avg_price() const { } const关键字表明这是一个const成员函数,它不可以修改Sales_item类的成员 ...
- C++(1)C++类四个默认函数---构造函数、析构函数、拷贝函数、赋值函数
C++构造函数和析构函数 默认构造函数指不带参数或者所有参数都有缺省值的构造函数!!! (1)构造函数.析构函数与赋值函数 构造函数.析构函数与赋值函数是每个类最基本的函数.它们太普通以致让人容易麻痹 ...
- C++ 默认拷贝构造函数 深度拷贝和浅拷贝
C++类默认拷贝构造函数的弊端 C++类的中有两个特殊的构造函数,(1)无参构造函数,(2)拷贝构造函数.它们的特殊之处在于: (1) 当类中没有定义任何构造函数时,编译器会默认提供一个无参构造函数且 ...
- java中自动插入一个默认的构造函数,这到底怎么回事?
1.2 当没有任何构造函数,java编译器,会插入一个默认的构造函数 见下面的例子: class Line { double x = 0.02; double y; } publ ...
- Autofac Getting Started(默认的构造函数注入)
https://autofaccn.readthedocs.io/en/latest/getting-started/index.html The basic pattern for integrat ...
- [C++]默认构造函数
默认构造函数(default constructor)就是在没有显示提供初始化式时调用的构造函数.它由不带参数的构造函数,或者为所有的形参提供默认实参的构造函数定义.若个定义某个类的变量时没有提供初始 ...
- 【C++对象模型】构造函数语意学之一 默认构造函数
默认构造函数,如果程序员没有为类定义构造函数,那么编译器会在[需要的时候]为类合成一个构造函数,而[需要的时候]分为程序员需要的时候和编译器需要的时候,程序员需要的时候应该由程序员来做工作,编译器需要 ...
- Swift—默认构造函数-备
结构体和类的实例在构造过程中会调用一种特殊的init方法,称为构造函数.构造函数没有返回值,可以重载.在多个构造函数重载的情况下,运行环境可以根据它的外部参数名或参数列表调用合适的构造函数.默认构造函 ...
随机推荐
- How to: Enable and Disable an Action Pane Button on a List Page [AX 2012]
Applies To: Microsoft Dynamics AX 2012 R2, Microsoft Dynamics AX 2012 Feature Pack, Microsoft Dynami ...
- pyQuery的安装
1. 直接通过pip安装 你会发现lxml怎么搞都报错,后来单独先安装libxml2和libxslt pip是找不到这个包的,只好百度.发现有很多的例子的解决方案.后来发现了个实用的. 2. 先安装l ...
- sublimetext2 中运行Python提示EOFError: EOF when reading a line
解决方法:一.安装sublimeREPL 打开sublimeText2按CTRL+SHIFT+P,英文版输入:install后选择Package Control: Install Package ...
- 【转】常用插件和mvn test命令
自定义构建Maven项目,需要包括额外的插件或者配置已存在的插件参数. 1. maven-compiler-plugin 指定JDK版本和编码方式 compiler插件能解决2个问题: 第一: mav ...
- Windows Server 2008 R2 64bit兼容Chrome浏览器
近日更换系统Windows Server 2008 R2 64bit系统,发现谷歌浏览器插件无法正常运行,终于找到如下解决方案: 打开桌面谷歌浏览器属性,将target目标 C:\Users\Admi ...
- kendo ui template的用法
kendo ui template的用法: Kendo UI 框架提供了一个易用,高性能的JavaScript模板引擎.通过模板可以创建一个HTML片段然后可以和JavaScript数据合并成最终的H ...
- 常用汉字的Unicode码表
\u96d5\u864e\u7684\u4e00\u4e86\u662f\u6211\u4e0d\u5728\u4eba\u4eec\u6709\u6765\u4ed6\u8fd9\u4e0a\u77 ...
- UIDynamic仿物理引擎-浮动碰撞效果-b
最近产品提了个需求(电商的APP-两鲜),需要在APP背景加上几个水果图案在那里无规则缓慢游荡...模仿 天天果园 APP的.好吧,那我就在网上找了很多文章,总结一下写个demo.效果如下: Mou ...
- mysql存储过程中传decimal值会自动四舍五入,没有小数
通过 call proc(0.2,0.5); 查看结果数据库竟然是0 和 1 原因:proc的参数没有设置好 参数:原本是 in a decimal,in b decimal 应该改为:in ...
- 简单易用的导出文件(Excel、word等各种格式)的方法
以前学习过NPOI导出数据到Excel中,代码较长,不易记忆.工作中,看到了其他同事写的代码,研究了一下,贴出来,共同学习. 使用这种方式,不仅可以设置表格的样式,而且代码简洁. 首先,在后台中通过S ...