c++类定义基础

笔者从c入手,转战c++的一个原因就是看中了c++对于面向过程的兼容和对于面向对象的支持,大型的软件项目无疑都是设计模式和面向对象的设计。而面向对象的基本单元则是类,类的基本思想是数据抽象和封装。数据抽象是一种依赖接口和实现分离的编程技术。接口包括用户能够进行的操作,实现则包括类的数据成员、负责接口实现的函数体以及定义类的成员函数,封装则实现了类的借口和实现的分离,封装可以隐藏类的实现细节,类的用户只能使用接口而无法直接访问实现部分。


一个类通常包括成员函数、数据成员、非成员的接口函数。成员函数为类的用户可以进行的各种操作,数据成员为类内部的数据属性,非成员的接口函数是待实现的接口。数据成员和成员函数一般在内部声明,其中成员函数可以在内部声明,在外部定义。而非成员的接口函数的定义和生命都在类的外部。例如:

struct Sales_data{
    //成员函数:关于sales_data对象的操作
    string isbn() const {return bookNo;}
    Sales_data & combine(const Sales_data&);
    double avg_price()const;
    //数据成员:属于sales_data对象的属性
    string bookNo;
    unsigned units_sold=0;
    double revenue=0.0;
};

//非成员接口函数
Sales_data add(const Sales_data&,const Sales_data&);
ostream &print(ostream&,const Sales_data);
istream & read(istream&,Sales_data&);


成员函数调用机制:

类中每一个成员函数都有一个隐式的名为this的形参,它是指向本类类型的指针。当我们调用成员函数时,实际上是用调用对象的地址初始化了了类中对应成员函数的this指针,在函数内部访问对象的数据成员时,只需使用数据成员名,而不用加this或者类名以及取成员运算符,因为编译器会隐式的加上this以及取成员运算符访问数据成员。例:

Sales_data a;//创建对象a

a.isbn();//调用a的isbn()函数

上述函数调用语句实际上等价于:

Sales_data::isbn(&a);//取a的地址,初始化isbn函数的隐式this指针,那么isbn函数内部对于数据成员的访问都是作用在a这个对象上

注:成员函数的this指针应该是一个常量指针,因为我们并不希望能够改变this中存放的对象地址。另外在函数体内也不会改变this所指向的对象(改变其成员数据不改变对象本身),所以this应该是一个指向常量的常量指针。

string isbn() const {return bookNo;}等价于

string isbn( const  Sales_data * const this) {return this->bookNo;}

在类的外部定义成员函数时,必须在函数名前加上所属的类名和域运算符,编译器根据类名决定函数属于哪个类的成员函数的定义


构造函数的声明和定义:

构造函数是对象被创建时首先执行的函数,一般类中不强制要求定义构造函数,如果无显式的构造函数,那么编译器会为类合成一个默认的构造函数,对于类中的数据成员进行默认初始化。但是编译器合成的默认构造函数功能有限,所以类设计者往往需要定义自己的构造函数,并且通常会重载多个不同的构造函数以满足不同情况的初始化需要。

构造函数没有返回值,且必须与类同名,其它部分与普通的成员函数定义基本相同,比较方便的是可以构造函数的参数列表之后函数体之前对于类中数据成员进行初始化,例如:

Sales_date::Sales_data(string &s,unsigned n,double p):bookNo(s),units_sold(n),revenue(p*n){ }

冒号以及后面出现的以逗号分割的数据成员紧跟初始值组成的整体叫做构造函数初始值列表,圆括号内的值用于初始化对应的数据成员,函数体为空。可没有构造函数初始值列表(或者说列表为空),可以在函数体里面对数据成员进行初始化操作。

注:构造函数可以调用类中的其它函数,也可以调用作为接口的非成员函数。

构造函数一样拥有一个隐式的this指针,存放被创建的对象的地址。

除了定义类的对象如何被初始化之外,还需要定义类的对象的拷贝、赋值、销毁等操作,如果没有显式定义这些操作,编译器会替我们合成,但是有时候也会出现问题。使用标准库类型可以较为安全地让编译器合成正常的拷贝、赋值、销毁等操作。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值