精华内容
下载资源
问答
  • 每一个类只有一个析构函数,但可以有多个构造...一般情况下,对于任意一个类A,如果程序员不显示的声明和定义上述函数,C++编译器将会自动的为A产生4个public inline 的默认函数,这4个函数最常见的形式为: A()...

    每一个类只有一个析构函数,但可以有多个构造函数(包含一个默认构造函数,一个拷贝构造函数,和其他普通构造函数)和多个赋值函数(包含一个拷贝赋值函数,其他的为普通赋值函数)。一般情况下,对于任意一个类A,如果程序员不显示的声明和定义上述函数,C++编译器将会自动的为A产生4个public inline 的默认函数,这4个函数最常见的形式为:

    A()                                                                //默认构造函数

    A(const A&)                                             //默认拷贝构造函数

    ~A()                                                            //默认析构函数

    A& operator = (const A &)                      //默认赋值函数。

    下面让我们使用程序来验证这4个函数的存在。

    #include <iostream>

    using namespace std;

    class A
    {
    };

    int main()
    {
     A a;
     cout << "OK! 存在默认无参数的构造函数" << endl;
     A b(a);
     cout << "OK! 存在默认拷贝构造函数" << endl;
     b=a;
     cout << "OK! 存在默认的拷贝赋值函数" << endl;

     return 0;
    }

    通过VC编译成功,并且能成功运行,故说明,一个类中存在默认的无参数的构造函数,默认的拷贝构造函数,还有默认的赋值函数。

     

    所以我们应该行使我们自己的权利,将这些函数按照我们自己的想法,将其改写!

     

    下面我想讲讲这些函数在构造对象时,是如何进行调用的?

    同样使用一个例子来介绍。

     

    #include <iostream>

    using namespace std;

    class A
    {
    public:
     A()
     {
      cout << "A::A()!" <<  endl;
     };
     A(const A &a)
     {
      cout << "A::A(const A &a)!" << endl;
     }

     A& operator=(const A &a)
     {
      cout << "A::A& operator=(const A &a)!" << endl;
      return *this;
     }
    };

    int main()
    {
     cout << "调用无参数构造函数" << endl;
     A a1;
     cout << endl;
     
     cout << "调用拷贝构造函数" << endl;
     A a2(a1);
     cout << endl;
     

    cout << "调用拷贝构造函数" << endl;
     A a3=a1;
     cout << endl;


     cout << "调用拷贝赋值函数" << endl;
     a2=a1;
     cout << endl;

      return 0;
    }

     

    通过这个例子,我们可以知道,创建一个对象,有三种方式,

    1、直接定义,例如A a1;

     2、通过其他对象,进行拷贝定义,例如A a2(a1);

     3、使用“=”进行赋值定义,例如A a3=a1;

    那么着三种方式的调用的函数时不同的

    第一种方式,调用普通的构造函数,来初始化对象。

    第二种方式,调用拷贝构造函数,来初始化对象。

    第三种方式,同样是调用拷贝构造函数,来初始化对象。

    注意  第二种方式和第三种方式 调用了相同的函数,尤其是第三种方式,并没有调用拷贝赋值函数。

     

    程序运行截图

    假如 我们在class A类中添加一个函数, bool hasAcceptableQuality(A a),那么在调用它时,我们使用a3.hasAcceptableQuality(a1)

    在这个函数中,我们使用的是值传递的方式,故在调用此函数时,实参a1将通过拷贝构造函数,来将值传递给形参a;所以当我们在使用对象作为参数时,

    一定要尽量使用引用传递,或者指针传递,这样可以效率更高!

    下面是程序实例

    #include <iostream>

    using namespace std;

    class A
    {
    public:
     A()
     {
      cout << "A::A()!" <<  endl;
     };
     A(const A &a)
     {
      cout << "A::A(const A &a)!" << endl;
     }
     
     A& operator=(const A &a)
     {
      cout << "A::A& operator=(const A &a)!" << endl;
      return *this;
     }

     bool hasAcceptableQuality(A a)
     {
      cout << "hasAcceptalbeQuality!" << endl;
      return true;
     }

    };

    int main()
    {
     cout << "调用无参数构造函数" << endl;
     A a1;
     cout << endl;
     
     cout << "调用拷贝构造函数" << endl;
     A a2(a1);
     cout << endl;
     
     cout << "调用拷贝赋值函数" << endl;
     a2=a1;
     cout << endl;
     
     cout << "调用拷贝构造函数" << endl;
     A a3=a1;
     cout << endl;

     a3.hasAcceptableQuality(a1);

     
     return 0;
    }

    结果图

     

    转载于:https://www.cnblogs.com/johnnyflute/p/3658272.html

    展开全文
  • 拷贝构造函数

    2018-07-11 18:28:36
    拷贝构造函数是一种特殊的构造函数,它在创建对象时,是使用同一类中之前创建的对象来初始化新创建的对象。拷贝构造函数通常用于:通过使用另一个同类型的对象来初始化新...拷贝构造函数的常见形式如下:classnam...

    拷贝构造函数是一种特殊的构造函数,它在创建对象时,是使用同一类中之前创建的对象来初始化新创建的对象。拷贝构造函数通常用于:

    • 通过使用另一个同类型的对象来初始化新创建的对象。

    • 复制对象把它作为参数传递给函数。

    • 复制对象,并从函数返回这个对象。

    如果在类中没有定义拷贝构造函数,编译器会自行定义一个。如果类带有指针变量,并有动态内存分配,则它必须有一个拷贝构造函数。拷贝构造函数的最常见形式如下:

    classname (const classname &obj) { // 构造函数的主体}

    在这里,obj 是一个对象引用,该对象是用于初始化另一个对象的。

    实例

    #include <iostream> using namespace std; class Line{ public: int getLength( void ); Line( int len ); // 简单的构造函数 Line( const Line &obj); // 拷贝构造函数 ~Line(); // 析构函数 private: int *ptr;}; // 成员函数定义,包括构造函数Line::Line(int len){ cout << "调用构造函数" << endl; // 为指针分配内存 ptr = new int; *ptr = len;} Line::Line(const Line &obj){ cout << "调用拷贝构造函数并为指针 ptr 分配内存" << endl; ptr = new int; *ptr = *obj.ptr; // 拷贝值} Line::~Line(void){ cout << "释放内存" << endl; delete ptr;}int Line::getLength( void ){ return *ptr;} void display(Line obj){ cout << "line 大小 : " << obj.getLength() <<endl;} // 程序的主函数int main( ){ Line line(10); display(line); return 0;}

    当上面的代码被编译和执行时,它会产生下列结果:

    调用构造函数
    调用拷贝构造函数并为指针 ptr 分配内存
    line 大小 : 10
    释放内存
    释放内存

    下面的实例对上面的实例稍作修改,通过使用已有的同类型的对象来初始化新创建的对象:

    实例

    #include <iostream> using namespace std; class Line{ public: int getLength( void ); Line( int len ); // 简单的构造函数 Line( const Line &obj); // 拷贝构造函数 ~Line(); // 析构函数 private: int *ptr;}; // 成员函数定义,包括构造函数Line::Line(int len){ cout << "调用构造函数" << endl; // 为指针分配内存 ptr = new int; *ptr = len;} Line::Line(const Line &obj){ cout << "调用拷贝构造函数并为指针 ptr 分配内存" << endl; ptr = new int; *ptr = *obj.ptr; // 拷贝值} Line::~Line(void){ cout << "释放内存" << endl; delete ptr;}int Line::getLength( void ){ return *ptr;} void display(Line obj){ cout << "line 大小 : " << obj.getLength() <<endl;} // 程序的主函数int main( ){ Line line1(10); Line line2 = line1; // 这里也调用了拷贝构造函数 display(line1); display(line2); return 0;}

    当上面的代码被编译和执行时,它会产生下列结果:

    调用构造函数
    调用拷贝构造函数并为指针 ptr 分配内存
    调用拷贝构造函数并为指针 ptr 分配内存
    line 大小 : 10
    释放内存
    调用拷贝构造函数并为指针 ptr 分配内存
    line 大小 : 10
    释放内存
    释放内存
    释放内存
    展开全文
  • //c++中的构造函数(六种):此处列举常见的四种构造函数 #include class Test { private: int value; public: //1缺省的构造函数:创建对象 Test(int x=0):value(x) //以参数列表的形式初始化所建立的对象 { ...
    //c++中的构造函数(六种):此处列举常见的四种构造函数
    #include<iostream.h>
    
    class Test
    {
    private:
    	int value;
    public:
    	//1缺省的构造函数:创建对象
    	Test(int x=0):value(x)           //以参数列表的形式初始化所建立的对象
    	{
    		cout<<"Creat Test:"<<this<<endl;
    	}
    	//2拷贝构造函数:用一个对象创建另一个对象
    	Test(const Test &it):value(it.value)
    	{
    		cout<<"Copy Creat Test"<<this<<endl;
    	}
    	//3赋值函数
    	Test & operator=(const Test &it) //&前面有类型(Test)所以it为引用
    	{
    		if(this != &it)              //此处&前面没类型所以为取地址符
    		{
    			value=it.value;
    		}
    		cout<<this<<" = "<<&it<<endl;
    		return *this;
    	}
    	//4析构函数
    	~Test()
    	{
    		cout<<"Destory Test:"<<this<<endl;
    	}
    
    	int Getvalue() const {return value;}
    };                                   //!!!!注意此处";"不可省略:否则出现bug
    
    Test fun(Test tp)
    {
    	int x=tp.Getvalue();
    	Test tmp(x);
    	return tmp;
    }
    void main()
    {
    	Test t1(10); 
    	Test t2=fun(t1);//创建对象有实参必带括号
    //	Test t2;                         //无实参必不带括号
    
    //	t2=fun(t1);
    
    //	Test func();                     //函数定义在主函数后面,不能直接调用,先声明(即此为函数声明)
    	                            	 //这种声明在c语言中随处可见(c++继承这种特性)
    //	Test t3();   
    	                                 //这种形式看做函数声明
    	cout<<"Main End" <<endl;
    }
    
    Test func()
    {
    	Test tp(10);
    	return tp;
    }

    展开全文
  • 注意:不能用字符或者整数初始化字符串 构造函数 常见string类构造函数有以下形式: 构造函数 ...将字符串str中始于stridx的部分作为构造函数的初值 string s(str, strbegin, strlen) 将字符串中...

    注意:不能用字符或者整数初始化字符串

    构造函数

    常见string类构造函数有以下形式:

    构造函数 作用
    string strs 生成空字符串
    string s(str) 生成字符串str的复制品
    string s(str, stridx) 将字符串str中始于stridx的部分作为构造函数的初值
    string s(str, strbegin, strlen) 将字符串中始于strbegin、长度为strlen的部分作为字符串初值
    string s(cstr) 以C_string类型cstr作为字符串s的初值
    string s(cstr, char_len) 以C_string类型cstr的前char_len个字符串作为字符串s的初值
    string s(num, c) 生成一个字符串,包含num个c字符
    string s(strs, beg, end) 以区间[beg, end]内字符作为字符串s的初值

    析构函数

    析构函数的形式如下:

    ~string()		//销毁所有内存,释放内存
    

    初始化

    如果字符串只含有一个字符,使用构造函数对其进行初始化通常有以下两种方式:

    std::string s(1,'x');
    std::string s("x");
    

    C_string与string的转换

    C_string一般被认为是常规的C++字符串。

    在C++中,从const char *到string转换时,存在一个隐式型别转换,却不存在能从string转换为C_string的隐式型别转换,可以通过c_str()函数返回string类对象对应的C_string。

    因此,在编写程序时,整段程序都应坚持使用string类对象,直到需要将类型转换为char *时才将其转换为C_string。

    #include <iostream>
    #include <string>
    using namespace std;
    
    int main(){
    	string str("12345678");
    	char ch[]="abcdefgh";
    	string a;					//定义一个空字符串
    	string str_1(str);			//构造函数,全部复制给str_1
    	string str_2(str, 2, 5);	//构造函数,从字符串str第2个字符开始,复制5个字符,赋值给str_2
    	string str_3(ch, 5);		//构造函数,将字符串ch的前5个元素赋值给str_3
    	string str_4(5, 'X');		//将5个'X'组成的字符串'XXXXX'赋值给str_4
    	string str_5(str.begin(), str.end());	//复制字符串str的所有元素,并赋值给str_5
    	
    	cout << str << endl;
    	cout << a << endl;
    	
    	cout << str_1 <<endl;
    	cout << str_2 <<endl;
    	cout << str_3 <<endl;
    	cout << str_4 <<endl;
    	cout << str_5 <<endl;
    	
    	return 0;
    }
    

    程序运行结果为:

    12345678
    
    12345678
    34567
    abcde
    XXXXX
    12345678
    
    展开全文
  • C++ 拷贝构造函数

    2020-08-07 16:29:42
    C++ 拷贝构造函数 1.拷贝构造函数是一个特殊构造函数,具有以下的一些特征: 不能被显示的调用,如果没有定义一个拷贝构造函数,编译系统会为我们合成一个... // 构造函数的主体 } Line(const Line &obj); /
  • c++拷贝构造函数

    2018-08-10 17:41:03
    拷贝构造函数是一种特殊的构造函数,它在创建对象时,是使用同一类中之前创建的对象来初始化新创建的对象。拷贝构造函数常用于: 通过使用另一个同类型的对象来初始化新创建...拷贝构造函数的常见形式如下: cl...
  • 构造函数、析构函数与赋值函数是每个类最基本的函数。...一般,对于任意一个类A,如果程序员不显式地声明和定义上述函数,C++编译器将自动为A产生4个public inline的默认函数,其最常见的形式为: A() //默认构造函数
  • 以TestClass为例: class TestClass { public: TestClass() {} }; 拷贝构造函数: TestClass(const TestClass&... // 形式1 TestClass(TestClass&...形式1是最常见的构造函数声明,这也是最好书写方式。 ...
  • 拷贝构造函数是一种特殊的构造函数,它在创建对象时,是使用同一类中之前创建的对象来初始化新创建的对象。拷贝构造函数通常用于:通过使用另一个同类型的对象来初始化新创建的...拷贝构造函数的常见形式如下:cla...
  • C++之拷贝构造函数

    2020-02-04 11:18:37
    拷贝构造函数是一种特殊的构造函数,它在创建对象时,是使用同一类中之前创建的对象来初始化新创建的对象。拷贝构造函数通常用于: 通过使用另一个同类型的对象来初始化新创建的...拷贝构造函数的常见形式如下:...
  • 一、this 解析器在调用函数时每次都会向函数内部传递进一个隐含的参数this,this指向的是函数执行上下文对象,根据函数调用的方式不同this会指向不同的对象。...2、以方法的形式调用,this是该方法的对象 ...
  • 构造函数名与类名相同。 函数没有函数返回值,就是将返回值说明成void也不行 。 构造函数一般声明为公有成员,...这个默认构造函数的形式如下: 类名::类名() { ...} 构造函数可以被重载,这在工程上十分常见。...
  • C++拷贝构造函数拷贝构造函数是一种特殊的构造函数,它在创建对象时,是使用同一类中之前创建的对象来初始化新创建的对象。拷贝构造函数通常用于通过使用另一个同类型的对象来...拷贝构造函数的常见形式如下:cla...
  • 导数中构造函数函数与方程思想、转化与化归思想是高中数学思想中比较重要的两大思想, 而构造函数的解题思路恰好是这两种思想的良好体现,尤其是在导数题型中,用处较多,也比较灵活多变,下面我们一起探讨导数小题...
  • 构造函数有四个参数,其中三个具有默认值。要初始化一个 string 类,可以使用 C 风格字符串或 ...常见的 string 类构造函数有以下几种形式: string strs //生成空字符串 string s(str) //生成字符串str复制品 s...
  • 构造函数有四个参数,其中三个具有默认值。要初始化一个 string 类,可以使用 C 风格字符串或 ...常见的 string 类构造函数有以下几种形式: string strs //生成空字符串 string s(str) //生成字符串str复制品 s...
  • 共公的构造函数是最为常见的形式,允许类被使用者实例化。 C#实例如下: 1class myClass 2{ 3 //Public Constructor 4 public myClass(){}; 5} VB实例如下: Class myClassClass myClass { ...
  • 在我上一篇文章里面 阐述了jQuery大致框架,知道了所有代码都是写在了一个自...如果是构造函数为什么不是 new $(document)的常见形式呢? 其实jQuery是面向对象js库,也有构造函数,每次调用jQuery方法是就会实例化
  • 拷贝构造函数是一种特殊的构造函数,它在创建对象时,是使用同一类中之前创建的对象来初始化新创建的对象。...拷贝构造函数的常见形式如下: classname (const classname &obj) { // 构造函数的主体 } 在
  • DotNet中的构造函数

    2006-03-29 14:30:00
    (1)公共构造函数 共公的构造函数是最为常见的形式,允许类被使用者实例化。C#实例如下:1class myClass2{3 //Public Constructor4 public myClass(){};5}VB实例如下:Class myClassClass myClass{ public Sub new...
  • 首先,可以从下面这个实用Demo讨论关于线程同步构造的实现。在多线程应用程序中,会经常为了限制并发访问共享资源...线程同步最常见的三种形式是:信号(semphore)、互斥(mutex)、和临界区(critical section)。
  • 概括:创建自定义类型常见方式,就是组合使用构造函数模式与原型模式。 好处:通过这种方式,不仅每个实例都有自己一份实例属性副本,而且同时又共享着对方法引用,最大限度节省了内存。而且这种混合...
  • 函数与方程思想、转化与化归一思想是高中数学思想中比较重要的两大思想,而构造函数的解题思路恰好是这两种思想的良好体现,尤其是在导数题型中。函数构造的题型一般比较灵活,一般主要涉及构造为f(x).g(x)与 两种...
  • 主要介绍了JS常见构造模式,结合实例形式对比分析了工厂模式、构造函数模式、原型模式、寄生构造函数模式、稳妥构造函数模式等相关概念、原理、实现方法与相关操作技巧,需要朋友可以参考下

空空如也

空空如也

1 2 3 4 5 ... 17
收藏数 340
精华内容 136
关键字:

常见构造函数的形式