C++初级问题
3个回答
展开全部
构造函数和析构函数其实没什么特别的,也没什么好说的,通俗的讲,
构造函数就是依照图纸(类的定义)造出一台机器;
析构就是当你不需要这台机器的时候或者系统认为这台机器没用的时候把它处理掉;
而复制构造函数做的是依照一台现成的机器(注意不是图纸,可能这台机器是破得少个轮子的)造一台完全一样的机器,调用它的场景有三种:一是对象作为函数的参数传入(是对象而非引用和指针)时,二是函数内的变量作为返回值返回时,三是用已有对象初始化时:Class c; Class c1=c;时,注意一定是初始化,如果已经初始化完了就不会调用了,如:Class c,c1; c1=c;这时就不会调用,这时掉用的是operator=,而且实际上Class c;Class c1=c;还可以写成Class c;Class c1(c);的形式;
operator=就是上面说的情况;
其实C++要想弄透了真的很难很难,我一两年没碰C++了,可能不准确。我学了三年C++(上学的时候,基本学的都是理论性的东西,MFC都没弄,完了还是觉得一知半解,呵呵),后来学过Java,php和as,现在都没有想回头弄C++的想法了,哈哈
构造函数就是依照图纸(类的定义)造出一台机器;
析构就是当你不需要这台机器的时候或者系统认为这台机器没用的时候把它处理掉;
而复制构造函数做的是依照一台现成的机器(注意不是图纸,可能这台机器是破得少个轮子的)造一台完全一样的机器,调用它的场景有三种:一是对象作为函数的参数传入(是对象而非引用和指针)时,二是函数内的变量作为返回值返回时,三是用已有对象初始化时:Class c; Class c1=c;时,注意一定是初始化,如果已经初始化完了就不会调用了,如:Class c,c1; c1=c;这时就不会调用,这时掉用的是operator=,而且实际上Class c;Class c1=c;还可以写成Class c;Class c1(c);的形式;
operator=就是上面说的情况;
其实C++要想弄透了真的很难很难,我一两年没碰C++了,可能不准确。我学了三年C++(上学的时候,基本学的都是理论性的东西,MFC都没弄,完了还是觉得一知半解,呵呵),后来学过Java,php和as,现在都没有想回头弄C++的想法了,哈哈
更多追问追答
追问
C++可以干些啥子东西?
Java 好学吗?
追答
C++可以做什么,我也说不好,老实说我基本没拿C++做过应用,以前学C,C++的基本语法,后来用C++没数据结构和算法,后来C++的可视化编程(不过就会了一点点Win32的程序,MFC不想学),后来学点嵌入式和Opengl(主要是原理和算法)。但后来工作后基本没用过C++了(就改写过一个我用java写好的游戏算法),所以这个我不能回答你,不过按我个人来说,我觉得后来学的java,php,as就好像是武术招式套路一样,和打过招我用这些,而每学一点新的东西,我一般都会下意识的回忆下C++,觉得C++就好像是禅理一样,学好这个,再回其他的就简单多了。
Java我也说不好好学不好学,因为一是我以C++为基础来学习,学习过程其实是一个对比的过程,感觉挺轻松的;二是我也不能说我会了java,因为学java就是拿来用,实用主义,不过确实上手快,几个星期就可以做一些商用规格的小软件了,你要是学生就好好学C++吧,其理论价值是非常非常大的,如果不是,你可以花点点时间尝试下java,你会体会到它的美妙的。。
展开全部
这个讲的再详细也不可能比教科书上的更详细,C++确实难理解,不过不必深究构造、析构和复制构造函数什么的。包括多重继承,这些不是C++的优点,反而是阻碍C++进步的绊脚石,否则就没有什么Java、Csharp的事情了。在实际运用中,这些东西也基本上用不到,你要真用了,不光是别人读你的程序费劲,你自己过两天来读程序也搞不清自己当初的思路。如果你现在在上课,大致理解其概念就可以了,我相信老师考试也不会深究其中内容的,老师也是明白人。除非你将来做Unix编程,还是编系统程序那种,否则了解概念就可以了。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
任何对象的构造(包括内置型)都要初始化,初始化包括复制初始化和直接初始化
构造函数在创建一个类对象的时候调用,在构造类对象的时候,首先调用构造函数,函数完成对象内部各成员的初始化,构造函数可以重载,如果没有构造函数,那么编译器在编译时会提供一个合成的默认构造函数,如果有写,那么编译器就不会再提供默认的构造函数,如果要使用默认的构造函数,你就只有显示的提供!
析构函数主要是在销毁对象的时候调用,释放构造函数或在对象生命期内获得的资源(内存),如果你的类没有动态分配内存,那么使用合成的默认析构函数就可以了,与构造函数不同,即便你有显示提供析构函数,编译器也会再次提供一个合成的默认构造函数!
复制构造函数,就是接受单个类类型引用形参(通常是const)的构造函数。与构造函数不同即使我们定义了其他构造函数,编译器也会为了我们合成一个!当然如果没有特别的需要直接使用合成的复制构造函数,如果你要禁止复制,可以将该复制构造函数显示声明成私有的,如果你希望友元和成员中的复制也禁止,那么可以只声明而不定义它!
赋值操作符=,是重载操作符之一,定义了该类型对象赋值时调用,如果没有定义,则编译器会合成一个!
一般如果类需要复制构造函数,那么也会需要赋值操作符!
class A
{
public:
A():i(0){}//构造函数,与编译器提供的合成默认构造函数同
A(const int &a):i(a),s(""){}//带一个参数的构造函数并用该参数初始化成员i,字符串初始化为空
A(const int &a,const stirng &str):i(a),s(str){}(""){}//带2个参数的构造函数并用第一个参数初始化成员i,第二个初始化字符串s
A(const A &a)//复制构造函数
{
i(a.i);
s(a.s);
}
A & operator = (const A &a)//赋值操作符
{
i = a.i;
s =a.s;
return *this;
}
~A()//析构函数
{
}
pivate:
int i;
string s;
};
下面是调用举例
A a;//调用A();
A a2(10),//调用A( int a)
A a3(10,"hello");//调用A(int a,const string & str)
A a4(a2)//调用 A(const A & a)
a = a4//调用赋值操作符
当以上4个对象销毁时,要调用析构函数,一般情况下析构函数调用的次数等于构造函数调用次数加上复制构造函数调用次数
构造函数在创建一个类对象的时候调用,在构造类对象的时候,首先调用构造函数,函数完成对象内部各成员的初始化,构造函数可以重载,如果没有构造函数,那么编译器在编译时会提供一个合成的默认构造函数,如果有写,那么编译器就不会再提供默认的构造函数,如果要使用默认的构造函数,你就只有显示的提供!
析构函数主要是在销毁对象的时候调用,释放构造函数或在对象生命期内获得的资源(内存),如果你的类没有动态分配内存,那么使用合成的默认析构函数就可以了,与构造函数不同,即便你有显示提供析构函数,编译器也会再次提供一个合成的默认构造函数!
复制构造函数,就是接受单个类类型引用形参(通常是const)的构造函数。与构造函数不同即使我们定义了其他构造函数,编译器也会为了我们合成一个!当然如果没有特别的需要直接使用合成的复制构造函数,如果你要禁止复制,可以将该复制构造函数显示声明成私有的,如果你希望友元和成员中的复制也禁止,那么可以只声明而不定义它!
赋值操作符=,是重载操作符之一,定义了该类型对象赋值时调用,如果没有定义,则编译器会合成一个!
一般如果类需要复制构造函数,那么也会需要赋值操作符!
class A
{
public:
A():i(0){}//构造函数,与编译器提供的合成默认构造函数同
A(const int &a):i(a),s(""){}//带一个参数的构造函数并用该参数初始化成员i,字符串初始化为空
A(const int &a,const stirng &str):i(a),s(str){}(""){}//带2个参数的构造函数并用第一个参数初始化成员i,第二个初始化字符串s
A(const A &a)//复制构造函数
{
i(a.i);
s(a.s);
}
A & operator = (const A &a)//赋值操作符
{
i = a.i;
s =a.s;
return *this;
}
~A()//析构函数
{
}
pivate:
int i;
string s;
};
下面是调用举例
A a;//调用A();
A a2(10),//调用A( int a)
A a3(10,"hello");//调用A(int a,const string & str)
A a4(a2)//调用 A(const A & a)
a = a4//调用赋值操作符
当以上4个对象销毁时,要调用析构函数,一般情况下析构函数调用的次数等于构造函数调用次数加上复制构造函数调用次数
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询