构造函数的有参和无参的区别,构造函数的参数是派啥用场的?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了构造函数的有参和无参的区别,构造函数的参数是派啥用场的?相关的知识,希望对你有一定的参考价值。
构造函数的有参和无参的区别,构造函数的参数是派什么用场的?
列题:class Shape
protected int x;
protected int y;
public Shape()
public Shape(int x,int y)
this.x = x;
this.y = y;
public void draw()
System.out.println("draw Shape\n"+ "x:" + this.x + "\n" + "y:" + this.y);
class Circle extends Shape
protected float r;
public Circle()
super(1,1);
public Circle(int x,int y,float r)
super(x,y);
this.r = r;
public void draw()
System.out.println("draw Circle"+ "\nx:" + this.x +"\ny:" + this.y + "\nr:" + this.r);
class Rectangle extends Circle
private float width;
private float height;
public Rectangle()
r = 1.0f;
public Rectangle(int x,int y,float r,float width,float height)
super(x,y,r);
this.width = width;
this.height = height;
public void draw()
System.out.println("draw Rectangle\n"+ "x:" + this.x + "\ny:" + this.y +"\nr:" + this.r + "\nwidth:" + this.width + "\nheight:" + this.height);
区别:
1.如果在创建对象时不写参数,调用的就是无参的构造方法。可是如果你写的有有参的构造方法,而没有无参的构造方法,那么再“创建对象时不写参数”就会报错,程序会认为你知道该怎么做。
如果构造方法有参数,在创建对象时传入了参数,那么就会调用此方法,这一点和重载类似。
2.没有参数的构造函数就是默认构造函数。
有参数的构造函数可用传递的参数给类中的属性赋初始值或执行初始化操作例如订阅事件等。
构造函数是在创建给定类型的对象时执行的类方法。构造函数具有与类相同的名称,它通常初始化新对象的数据成员。
任何时候,只要创建类或结构,就会调用它的构造函数。类或结构可能有多个接受不同参数的构造函数。构造函数使得程序员可设置默认值、限制实例化以及编写灵活且便于阅读的代码。
如果没有为对象提供构造函数,则默认情况下 C# 将创建一个构造函数,该构造函数实例化对象,并将所有成员变量设置系统指定的默认值。静态类和结构也可以有构造函数。
扩展资料
主要特点
1.构造函数的命名必须和类名完全相同。在java中普通函数可以和构造函数同名,但是必须带有返回值;
2.构造函数的功能主要用于在类的对象创建时定义初始化的状态。它没有返回值,也不能用void来修饰。这就保证了它不仅什么也不用自动返回,而且根本不能有任何选择。而其他方法都有返回值,即使是void返回值。尽管方法体本身不会自动返回什么,但仍然可以让它返回一些东西,而这些东西可能是不安全的;
3.构造函数不能被直接调用,必须通过new运算符在创建对象时才会自动调用;而一般的方法是在程序执行到它的时候被调用的;
4.当定义一个类的时候,通常情况下都会显示该类的构造函数,并在函数中指定初始化的工作也可省略,不过Java编译器会提供一个默认的构造函数.此默认构造函数是不带参数的。而一般的方法不存在这一特点;
5.构造函数有回滚的效果,构造函数抛出异常时,构造的是一个不完整对象,会回滚,将此不完整对象的成员释放(c++)
6.当一个类只定义了私有的构造函数,将无法通过new关键字来创建其对象,当一个类没有定义任何构造函数,C#编译器会为其自动生成一个默认的无参的构造函数。
参考资料:百度百科——构造函数
参考技术A在java中,构造函数在对象创建时自动调用执行,常用来给类的成员变量赋初始值。有参表示新建对象的时候可以有参数。
构造函数的参数允许你根据实际需要灵活输入参数值,增加了方法的复用性,减少了冗余代码,增加了代码的执行效率。
这段代码的输出是
draw Rectangle
x=1
y=1
r=1.0
width=0.0
height=0.0
draw Rectangle
x=2
y=3
r=5
width=10
height=11
扩展资料:
构造函数的特点:
1、构造函数的命名必须和类名完全相同。在java中普通函数可以和构造函数同名,但是必须带有返回值。
2、构造函数的功能主要用于在类的对象创建时定义初始化的状态。它没有返回值,也不能用void来修饰。这就保证了它不仅什么也不用自动返回,而且根本不能有任何选择。
而其他方法都有返回值,即使是void返回值。尽管方法体本身不会自动返回什么,但仍然可以让它返回一些东西,而这些东西可能是不安全的。
3、构造函数不能被直接调用,必须通过new运算符在创建对象时才会自动调用;而一般的方法是在程序执行到它的时候被调用的。
4、当定义一个类的时候,通常情况下都会显示该类的构造函数,并在函数中指定初始化的工作也可省略,不过Java编译器会提供一个默认的构造函数.此默认构造函数是不带参数的。而一般的方法不存在这一特点。
5、构造函数有回滚的效果,构造函数抛出异常时,构造的是一个不完整对象,会回滚,将此不完整对象的成员释放(c++)。
6、当一个类只定义了私有的构造函数,将无法通过new关键字来创建其对象,当一个类没有定义任何构造函数,C#编译器会为其自动生成一个默认的无参的构造函数。
7、在Python中构造函数必须通过重写__init__方法实现。
参考资料:百度百科-构造函数
在java中,构造函数在对象创建时自动调用执行,常用来给类的成员变量赋初始值。
构造函数的参数允许你根据实际需要灵活输入参数值,增加了方法的复用性,减少了冗余代码,增加了代码的执行效率。
以你的代码为例Rectangle rectangle = new Rectangle();
rectangle.draw();
rectangle = new Rectangle(2, 3, 5, 10, 11);
rectangle.draw();
这段代码的输出是
draw Rectangle
x:1
y:1
r:1.0
width:0.0
height:0.0
draw Rectangle
x:2
y:3
r:5
width:10
height:11
扩展资料
都在对象被构造的时候被调用,只是在构造对象时根据new对象的参数类型和个数进行选择对应的构造方法进行调用,当没有参数时调用无参构造方法,有参数时调用对应的有参构造方法。
构造函数的参数一般用来初始化类的数据成员。
构造函数的特点及作用:
构造函数的命名必须和类名完全相同。
2. 构造函数的功能主要用于在类的对象创建时定义初始化的状态。它没有返回值,也不能用void来修饰。
3. 构造函数不能被直接调用,必须通过new运算符在创建对象时才会自动调用。
4. 当定义一个类定义的时候,通常情况下都会默认一个构造函数,此默认构造函数是不带参数的。当自定义了含参构造函数时,默认构造函数将需要手动书写出来。
参考技术C都在对象被构造的时候被调用,只是在构造对象时根据new对象的参数类型和个数进行选择对应的构造方法进行调用,当没有参数时调用无参构造方法,有参数时调用对应的有参构造方法。构造函数的参数一般用来初始化类的数据成员。
构造函数的特点及作用:
构造函数的命名必须和类名完全相同。
构造函数的功能主要用于在类的对象创建时定义初始化的状态。它没有返回值,也不能用void来修饰。
构造函数不能被直接调用,必须通过new运算符在创建对象时才会自动调用。
当定义一个类定义的时候,通常情况下都会默认一个构造函数,此默认构造函数是不带参数的。当自定义了含参构造函数时,默认构造函数将需要手动书写出来。
在java中,构造函数在对象创建时自动调用执行,常用来给类的成员变量赋初始值。
构造函数的参数允许你根据实际需要灵活输入参数值,增加了方法的复用性,减少了冗余代码,增加了代码的执行效率。
以你的代码为例
Rectangle rectangle = new Rectangle();
rectangle.draw();
rectangle = new Rectangle(2, 3, 5, 10, 11);
rectangle.draw();
这段代码的输出是
draw Rectangle
x:1
y:1
r:1.0
width:0.0
height:0.0
draw Rectangle
x:2
y:3
r:5
width:10
height:11
拓展资料
构造函数 ,是一种特殊的方法。
主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中。
特别的一个类可以有多个构造函数 ,可根据其参数个数的不同或参数类型的不同来区分它们 即构造函数的重载。
C++无参构造函数
#include<iostream.h>
#include<string.h>
class student
int age;char name[10];char num[8];
public:
student()age=0; *name="noname"; *num="0000";
set(int n,char *pn,char *pnum);
void print()
cout<<"age:"<<endl;
cout<<"name:"<<endl;
cout<<"num:"<<endl;
;
student::set(int n,char *pn,char *pnum)
age=n;
strcpy(name,pn);
strcpy(num,pnum);
main()
student a[2];
a[0].set(18,"chen","0123");
a[1].set(19,"cai","0124");
a[0].print();
a[1].print();
这是我写的垃圾代码,我想问的是我一运行这个为什么会出现如下错误呢?
注意我问是为什么啊!我的错误在于无参构造函数那应该改为student()int age=0;char *name="noname";char *num="0000";
D:\Program Files\Microsoft Visual Studio\MyProjects\student\student.cpp(6) : error C2440: '=' : cannot convert from 'char [7]' to 'char'
This conversion requires a reinterpret_cast, a C-style cast or function-style
谢谢啦
这是你的定义语句,很明显name,num都是字符数组名称。
再来看这段代码:
student()age=0; *name="noname"; *num="0000";
*name代表name[0](因为name即字符数组的首地址,那么*name就是指字符数组第一个元素的值),*num同理。
所以用一个字符串(noname)对单个字符变量(name[0])赋值,编译就会检测出错.误。即cannot convert from 'char [7]' to 'char' (不能将字符数组转化为字符数组的一个元素)。
希望可以帮到你~ 参考技术A 你的代码已经非常好了。
你可以将char 修改成 std::string 就没有任何问题了。
如下
class student
int age;std::strin name;std::string num;
既然C++提供了给你字符串,你就要懂得利用资源 参考技术B 原因是这样的:
首先明确几个问题
1.数组的名字是个地址(指针)指向数组第一元素.
2.用双引号括起来的字符串也是一个地址!
3.用*运算符对一个指针操作,是引用这个指针指向的变量.
4.char * p; 变量声明中的*不是运算符,它是个标志与 3 中不同。
你的错误:
1.student()age=0; *name="noname"; *num="0000";
*name就是引用了name数组的第一个char类型变量,你把一个指针赋值给char当然不对!!
2.为什么改完就对了呢?因为char *name="noname";char *num="0000"中,你定义了两个char指针型局部变量:name、num。这两个变量和前面的两个数组没关系!!之所以同名不报错是因为优先级的原因,但是你这个构造函数是一点作用都没起到!! 参考技术C 当然不行,你可以把数组变量名看成一个const指针,="xxxx"这种符值的方法其实就是把"xxxx"的地址符给变量,更何况*name和*num实际是指向了数组里的第一个元素,除非你每个元素也是个指针,否则这样的符值肯定是错误的 参考技术D 使用
strcpy(name, "noname");
strcpy(num, "0000");
以上是关于构造函数的有参和无参的区别,构造函数的参数是派啥用场的?的主要内容,如果未能解决你的问题,请参考以下文章
设计Person类和Student类,Student类继承自Person类,要求写出两个类的无参和有参的构造函数,设计两个类