c++学习笔记 -- 构造函数

来源:互联网 发布:jsp新闻发布系统源码 编辑:程序博客网 时间:2024/06/01 08:17

声明:代码出处http://www.weixueyuan.net/view/6339.html


构造函数是类中一种特殊的成员函数,其特殊之处有三点:

  • 构造函数的函数名必须与类名相同;
  • 构造函数无返回值;
  • 当我们创建类对象的时候构造函数会被自动调用,而无需我们主动调用。


一个类中可以有多个构造函数,构造函数之间构成函数重载的关系。

通常如果在定义类的时候,程序设计人员没有主动声明任何一个构造函数的时候,系统会自动生成一个默认构造函数,默认构造函数就是不带任何参数的构造函数。

其它带参数的构造函数统称为带参构造函数。

我们创建了带参构造函数,默认构造函数不会被自动创建

在构造函数中还可以调用函数:


class book
{
public:
    book(){}
    book(char* a, double p){init(a,p);};
    void setprice(double a);
    double getprice();
    void settitle(char* a);
    char * gettitle();
    void display();
    void init(char* a, double p);
private:
    double price;
    char * title;
};


void book::init(char* a, double p)
{
    title = a;
    price = p;
}

//----------------------------------------------------------


一个带默认参数的构造函数

  1. #include<iostream>
  2. usingnamespace std;
  3. classbook
  4. {
  5. public:
  6. book(){}
  7. book(char* a, double p = 5.0);
  8. voiddisplay();
  9. private:
  10. double price;
  11. char* title;
  12. };
  13. book::book(char* a, double p) //在定义函数的时候可以不指定默认参数
  14. {
  15. title = a;
  16. price = p;
  17. }
  18. void book::display()
  19. {
  20. cout<<"The price of "<<title<<" is $"<<price<<endl;
  21. }
  22. intmain()
  23. {
  24. bookHarry("Harry Potter",49.9);
  25. Harry.display();
  26. bookGone("Gone with the Wind");
  27. Gone.display();
  28. return0;
  29. }


需要说明的是带默认参数的构造函数,其默认参数必须置于参数列表的结尾。如果例1中带参构造函数 book(char* a, double p = 5.0); 被声明成 book(double p = 5.0, char* a); 则是无法通过编译的,因为默认参数不在参数列表的结尾。

确切的说是带默认参数的形参的右边 不能有没带参数的形参

目的是为了消除二义性


如:

book(double a,int b,int c):a(0),b(0),c(0);
book(double a = 1,int b,int c = 2);
 
如果定义 book b1(3); 编译器就不知道你要调用哪一个构造函数了。

//-------------------------------------


拷贝构造函数,顾名思义,就是通过拷贝对象的方式创建一个新对象。拷贝构造函数有两种原型


  1. book(book&b);
  2. book(constbook&b);


这两种原型都是book类对象的引用。

如果拷贝构造函数的参数不是对象的引用,则是不允许的。

拷贝构造函数除了能有对象引用这样的参数之外,同样也能有其它参数。但是其它参数必须给出默认值

  1. book(constbook&b, price=5.0);

  1. classbook
  2. {
  3. public:
  4. book(){}
  5. book(book&b);
  6. book(char* a, double p = 5.0);
  7. voiddisplay();
  8. private:
  9. double price;
  10. char* title;
  11. };
  12. book::book(book&b)
  13. {
  14. price = b.price;
  15. title = b.title;
  16. }
  17. book::book(char* a, double p)
  18. {
  19. title = a;
  20. price = p;
  21. }
  22. void book::display()
  23. {
  24. cout<<"The price of "<<title<<" is $"<<price<<endl;
  25. }


如果一个类中包含指向动态分配存储空间的指针类型的成员变量时,就应该为这个类设计一个拷贝构造函数,除了需要设计一个拷贝构造函数之外,还需要为它添加一个赋值操作符重载函数


#include <iostream>#include <iomanip>using namespace std;class Sample{public:Sample(){cout<<"Sample chuxian"<<++a<<endl;}~Sample(){cout<<"Sample likai"<<--a<<endl;}private:static int a; }; int Sample:: a = 0;int main(){Sample a[2],*p[3],&b = a[1];return 0;}
构造函数 只用普通函数调用了构造函数 指针和引用都不会去调用构造函数 



0 0
原创粉丝点击