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;
}
{
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;
}
//----------------------------------------------------------
一个带默认参数的构造函数
- #include<iostream>
- usingnamespace std;
- classbook
- {
- public:
- book(){}
- book(char* a, double p = 5.0);
- voiddisplay();
- private:
- double price;
- char* title;
- };
- book::book(char* a, double p) //在定义函数的时候可以不指定默认参数
- {
- title = a;
- price = p;
- }
- void book::display()
- {
- cout<<"The price of "<<title<<" is $"<<price<<endl;
- }
- intmain()
- {
- bookHarry("Harry Potter",49.9);
- Harry.display();
- bookGone("Gone with the Wind");
- Gone.display();
- return0;
- }
需要说明的是带默认参数的构造函数,其默认参数必须置于参数列表的结尾。如果例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); 编译器就不知道你要调用哪一个构造函数了。
//-------------------------------------
拷贝构造函数,顾名思义,就是通过拷贝对象的方式创建一个新对象。拷贝构造函数有两种原型
- book(book&b);
- book(constbook&b);
这两种原型都是book类对象的引用。
如果拷贝构造函数的参数不是对象的引用,则是不允许的。
拷贝构造函数除了能有对象引用这样的参数之外,同样也能有其它参数。但是其它参数必须给出默认值
- book(constbook&b, price=5.0);
- classbook
- {
- public:
- book(){}
- book(book&b);
- book(char* a, double p = 5.0);
- voiddisplay();
- private:
- double price;
- char* title;
- };
- book::book(book&b)
- {
- price = b.price;
- title = b.title;
- }
- book::book(char* a, double p)
- {
- title = a;
- price = p;
- }
- void book::display()
- {
- cout<<"The price of "<<title<<" is $"<<price<<endl;
- }
如果一个类中包含指向动态分配存储空间的指针类型的成员变量时,就应该为这个类设计一个拷贝构造函数,除了需要设计一个拷贝构造函数之外,还需要为它添加一个赋值操作符重载函数
#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
- (C/C++学习笔记)Copy构造函数应用场景
- 【学习C++】3.构造函数
- 拷贝构造函数学习笔记
- C++构造函数学习笔记
- 构造函数学习笔记(1)
- 学习笔记:构造函数转发
- JS构造函数学习笔记
- OC学习笔记,构造函数
- 学习笔记01-构造函数
- js构造函数学习笔记
- 复制构造函数学习笔记
- c++学习笔记 -- 构造函数
- C++学习笔记--构造函数
- C/C++学习笔记:String类的构造函数、析构函数和赋值函数
- C++学习笔记11 构造函数与析构函数
- Objective-C学习笔记---构造函数和析构函数
- Objective-C学习笔记---构造函数和析构函数
- 【C++】学习笔记四十七——类的构造函数和析构函数
- 最常用的 Eclipse 快捷键总结
- 谷歌近期开源的SLAM方案在下一盘怎样的大棋?
- Shell控制结构
- 揭秘Java网络爬虫程序原理
- 北邮oj 278图像识别
- c++学习笔记 -- 构造函数
- JavaScript的基本语法
- 堆栈、队列数据结构的特点
- 深入了解java之虚拟机内存
- android程序中调用shell命令
- Java设计模式-单例模式
- opencv python 图像二值化
- HDU 1536 S-Nim (SG函数)
- mysql 安装 和解决navicat 10061 1045错误