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

本文详细介绍了构造函数的概念及其在类中的作用,包括默认构造函数、带参构造函数、拷贝构造函数等不同类型的构造函数,并解释了如何正确使用带有默认参数的构造函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

声明:代码出处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;	

}
构造函数 只用普通函数调用了构造函数 指针和引用都不会去调用构造函数 



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值