构造函数和类不存在默认构造函数数有什么区别

编程开发子分类请问构造方法和普通方法有什么区别?_java吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:463,463贴子:
请问构造方法和普通方法有什么区别?收藏
求讲解, 清楚点。 先在这里谢谢大家了
刘备:军师,此次伐魏你有何妙计?
淼,坐等楼下大神解释
楼上没吃药。学java呢!
构造方法和普通方法在定义上有区别:首先构造方法没有返回值,并且名字要与类名保持一致。构造方法可以用来完成,成员属性的初始化工作。每个类至少有一个构造方法,如果没有,系统会提供一个默认的无参构造.而普通方法,就是类的行为举止。表明该做什么事情..等等。
1、方法有返回类型,方法名小写,不能和类名相同;构造方法没有返回类型,void也不行,名与类名相同。2、构造方法是初始化对象的重要途径,所以就算你给一个类没有定义构造方法,方法在这个类的加载得时候,会自动提供一个没有参数的构造方法。所以,常见得 Student s=new Student();那么,s这个实例,是通过构造方法初始化的;而普通方法不行3、他们运行顺序不同。一个类在初始化的时候,例如People是Student的父类,有构造方法 public PeoPle(){}那么,当实例化Student p=new Student()得时候,父类的构造方法会隐式执行(你可自己敲代码尝试,父类构造方法中写个输出语句:例如System.out.println("父类构造方法"))。你会发现,没有调用任何父类,也没有实例化父类,但是构造方法却执行了。构造方法被程序员调用的时候 必须用new 关键字。4、方法仅仅是类成员,构造方法也是类成员,但是,构造方法有对类属性得初始化的功能。所以,常见到 public PeoPle(String name){this.name=name}或者 public PeoPle(){name="wangsan",age=14},完成了对People类属性name或者age的初始化以上百度的
你new一个新对象时必须要调用构造方法才行,构造方法一般用来给成员变量赋初值的,而方法则是在new完之后再调用的,并且构造方法不能有返回值且名字必须和类名是一样的
有返回值声明段和没有返回值声明段的区别
说白了!构造方式是赋初始值用的!方法是被调用的!
构造方法的作用:1 只有提供了构造方法才可以实例化对象(假设没有构造方法,那么这个类(静态类除外)就没有任何意义)2 初始化参数,带参数的构造方法可以在初始化时为类成员赋值
构造方法是用来创建对象的方法,语法上没有返回类型,功能就是用来创建对象的
还有一点构造方法是是一种特殊的方法!
----------- 一个人,如果你不逼自己一把,你根本不知道自己有多优秀!
构造方法就是在new对象的时候就会调用的方法
更喜欢叫构造器 就是用来在new的时候提前做好相关工作 比如初始化什么的
构造方法是对象一创建,就调用并执行一般方法是需要用的时候才调用执行
比如new一个student
并且给这个student给个名字,那你Student A=new Student()A.setName(&LZSB&)方便呢,
还是创建构造方法后,直接Student A=new Student(&LZSB&)方便呢?
你在新建对象的时候,调用的就是那个类的构造器或者叫构造方法,例如Baidu bd = new Baidu();,这里new后面的就是构造器,构造方法是没有返回值的,普通方法有返回值,而且构造方法第一个字母必须大写,而且跟类名是一样的,普通方法第一个字母不是大写的
构造的j8特别大
新手到这,表示一脸懵逼
5楼,简单明了,一语中的。
登录百度帐号推荐应用
为兴趣而生,贴吧更懂你。或内部类,继承 和 构造函数之间到底有什么区别?
内部类 和 继承都能同时得到另一个类的成员变量和成员方法, 构造函数可以通过传入另一个类的对象 使得该类获得所有变量和方法,求问 这三者之间在应用时主要如何使用的
内部类可以可以获得外部类所有的东西,包括私有的作为构造函数参数等同于内部类,可以访问所有东西继承之后,子类能获得父类的所有东西except "private xxx"具体怎么用自己做点项目就知道了~~
已有帐号?
无法登录?
社交帐号登录其他回答(4)
楼主,你可以看下那个clr via c#的书,看了以后,你肯定有很大的收获
园豆:9719
你先去深入学习下面向对象再来讨论构造函数、析构函数的必要性。
园豆:44637
园豆:44637
园豆:44637
构造函数是一种特殊的方法,主要是为了给初始化对象赋初值。但是我可以直接在初始化时就赋值啊。
构造函数可以包含参数,构造函数包含的参数给调用者提出要求:这些参数,是创建这个类必须要用的。这比你直接在初始化的时候赋值更灵活,也更规范。
C#里的静态构造函数和JAVA里的静态块应该是一个概念
我对java的静态块了解的不是很深入,就我看来效果差不多。C#的静态构造函数在这个类第一次被使用的时候执行一次,并且只会执行一次。
收获园豆:35
园豆:6106
这个简单的例子作用是当new User()的时候自动生成了CreateTime。在语言层面,你完全可以没有任何构造函数,然后这么做:
var user = new User();
user.CreateTime = DateTime.N
这样产生的user对象是一样的。但是从设计方面,后一种做法把CreateTime的赋值工作交给了调用者,这样的程序就依赖&调用者的素质&,比如,调用者不知道要给这个字段赋值,或者胡乱赋值,等等。因此是很不同的。
园豆:6106
所以我会觉得构造函数并不是必须的。&
园豆:6106
C#里的静态构造函数和JAVA里的静态块应该是一个概念
园豆:2026
&&&您需要以后才能回答,未注册用户请先。构造函数、析构函数、赋值函数是每个类最基本的的函数。每个类只有一个析构函数和一个赋值函数。但是有很多构造函数(一个为复制构造函数,其他为普通构造函数。对于一个类A,如果不编写上述四个函数,c++编译器将自动为A产生四个默认的函数,即:
A(void)&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&//默认无参数构造函数
A(const A &a)&&&&&&&&&&&&&&&&&&&&&&&& //默认复制构造函数
~A(void);&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &//默认的析构函数
A & operator = (const A &a); //默认的赋值函数
既然能自动生成函数,为什么还需要自定义?原因之一是&默认的复制构造函数&和"默认的赋值函数&均采用&位拷贝&而非&值拷贝&
位拷贝& v.s.& 值拷贝
为便于说明,以自定义String类为例,先定义类,而不去实现。
#include &iostream&
using namespace
class String
String(void);
String(const String &other);
~String(void);
String & operator =(const String &other);
位拷贝拷贝的是地址,而值拷贝拷贝的是内容。
如果定义两个String对象a, b。当利用位拷贝时,a=b,其中的a.val=b.val;但是a.m_data=b.m_data就错了:a.m_data和b.m_data指向同一个区域。这样出现问题:
a.m_data原来的内存区域未释放,造成内存泄露
a.m_data和b.m_data指向同一块区域,任何一方改变,会影响到另一方
当对象释放时,b.m_data会释放掉两次
当类中还有指针变量时,复制构造函数和赋值函数就隐含了错误。此时需要自己定义。
有一种特别常见的情况需要自己定义复制控制函数:类具有指针哈函数。
赋值操作符和复制构造函数可以看成一个单元,当需要其中一个时,我们几乎也肯定需要另一个
三法则:如果类需要析构函数,则它也需要赋值操作符和复制构造函数
如果没定义复制构造函数(别的不管),编译器会自动生成默认复制构造函数
如果定义了其他构造函数(包括复制构造函数),编译器绝不会生成默认构造函数
即使自己写了析构函数,编译器也会自动生成默认析构函数
因此此时如果写String s是错误的,因为定义了其他构造函数,就不会自动生成无参默认构造函数。
复制构造函数& v.s.& 赋值函数
#include &iostream&
#include &cstring&
using namespace
class String
String(const char *str);
String(const String &other);
String & operator=(const String &other);
~String(void);
String::String(const char *str)
cout && "自定义构造函数" &&
if (str == NULL)
m_data = new char[1];
*m_data = '\0';
int length = strlen(str);
m_data = new char[length + 1];
strcpy(m_data, str);
String::String(const String &other)
cout && "自定义拷贝构造函数" &&
int length = strlen(other.m_data);
m_data = new char[length + 1];
strcpy(m_data, other.m_data);
String & String::operator=(const String &other)
cout && "自定义赋值函数" &&
if (this == &other)
return *this;
delete [] m_
int length = strlen(other.m_data);
m_data = new char[length + 1];
strcpy(m_data, other.m_data);
return *this;
String::~String(void)
cout && "自定义析构函数" &&
delete [] m_
int main()
cout && "a(\"abc\")" &&
String a("abc");
cout && "b(\"cde\")" &&
String b("cde");
cout && " d = a" &&
String d =
cout && "c(b)" &&
String c(b);
cout && "c = a" &&
1. 赋值函数中,上来比较 this == &other 是很必要的,因为防止自复制,这是很危险的,因为下面有delete []m_data,如果提前把m_data给释放了,指针已成野指针,再赋值就错了
2. 赋值函数中,接着要释放掉m_data,否则就没机会了(下边又有新指向了)
3. 拷贝构造函数是对象被创建时调用,赋值函数只能被已经存在了的对象调用
&&& 注意:String a("hello"); String b("world");& 调用自定义构造函数
&&&&&&&&&&&& String c=a;调用拷贝构造函数,因为c一开始不存在,最好写成String c(a);
阅读(...) 评论()

我要回帖

更多关于 不存在默认构造函数 的文章

 

随机推荐