1.类和类成员
C++提供了如char、int、long、float、double等基本数据类型,足够用来解决大多数哦相对简单的问题,但对于复杂的问题就比较困难了。
C++的一个实用特性是自定义数据类型;如之前的枚举和结构体:
struct Goods
{
char* mname;
float mprice;
int mamount;
}
struct 类中默认访问限定符是公有的,OOP类中默认访问限定符是私有的;
类的封装:访问限定符
public:任意位置都可以进行访问
protect:子类、本类类中允许访问
private:本类类中访问
class CGoods
{
public:
void Sell()
{
--mamount;
}
void Buy()
{
++mamount;
}
private:
char* mname;
float mprice;
int mamount;
};
对象的生成:
(1)对象开辟内存空间;
(2)对象内存做初始化,调用构造函数
对象的销毁:
(1)释放对象所占的其他资源,调用析构函数;
(2)释放对象所占的内存空间;
二、c++中的六个默认函数(若程序不定义或不调用,编译器自动定义或调用的函数)
(1)构造函数:
类的一种特殊的成员函数,当类被实例化时执行;通常用以初始化。
构造函数有明确的命名规则:A)函数名必须和类名一样;B)无返回类型(包括void)。
无参构造函数-不带参数的构造函数,是类的默认构造函数
class Test
{
public:
Test(int a, int b)
{
std::cout << this << "Test:: Test(int,int)" << std::endl;
ma = a;
mb = b;
}
Test(int a)
{
std::cout << this << "Test:: Test(int)" << std::endl;
ma = a;
}
Test()
{
std::cout << this << "Test:: Test()" << std::endl; //默认构造函数
}
Test(const Test& rhs)
{
std::cout << this << "Test:: Test(const Test&)" << std::endl;
ma = rhs.ma;
mb = rhs.mb;
}
(2)析构函数:
析构函数(destructor) 与 构造函数相反,当对象结束其 生命周期时(例如对象所在的函数已调用完毕),系统 自动 执行析构函数。当程序中没有析构函数时,系统会自动生成析构函数。
特点:不可重载、可以手动进行调用,先构造,后析构。
作用:释放对象资源。
~Test()
{
std::cout << this << "Test::~Test()" << std::endl;
}
(3)拷贝构造函数:
由编译器调用来完成一些基于同一类的其他对象的构建及初始化(默认为浅拷贝)
拷贝构造函数调用的三种形式
(1)一个对象作为函数参数,以值传递的方式传入函数体;
(2)一个对象作为函数返回值,以值传递的方式从函数返回;
(3)一个对象用于给另外一个对象进行初始化(常称为复制初始化)。
class Test
{
public:
Test(int a, int b)
{
std::cout << this << "Test:: Test(int,int)" << std::endl;
ma = a;
mb = b;
}
Test(int a)
{
std::cout << this << "Test:: Test(int)" << std::endl;
ma = a;
}
Test()
{
std::cout << this << "Test:: Test()" << std::endl;
}
Test(const Test& rhs)
{
std::cout << this << "Test:: Test(const Test&)" << std::endl;
ma = rhs.ma;
mb = rhs.mb;
}
Test& operator=(const Test& rhs)
{
std::cout << this << "Test::operator = (const Test&)" << std::endl;
if (this != &rhs)
{
ma = rhs.ma;
mb = rhs.mb;
}
return *this; //拷贝构造函数
}
~Test()
{
std::cout << this << "Test::~Test()" << std::endl;
}
(4)赋值运算符的重载函数:
1.判断自赋值;
2.释放旧资源;
3.开辟新资源;
4.赋值;
形参中const的作用:1.防止实参被修改;2.接收隐式生成的临时量;
CGoods(const CGoods& rhs)
{
std::cout << this << " CGoods::CGoods(const CGoods&)" << std::endl;
mname = new char[strlen(rhs.mname) + 1]();
strcpy(mname, rhs.mname);
mprice = rhs.mprice;
mamount = rhs.mamount;
} //普通构造函数
CGoods& operator=(const CGoods& rhs) //赋值运算符重载函数
{
std::cout << this << " CGoods::operator=(const CGoods&)" << std::endl;
if (this != &rhs) //判断自赋值
{
delete[] mname; //释放旧资源
mname = new char[strlen(rhs.mname) + 1](); //申请开辟新资源
strcpy(mname, rhs.mname);
mprice = rhs.mprice;
mamount = rhs.mamount; //赋值
}
return *this;
}
~CGoods() //调用析构函数
{
std::cout << this << " CGoods::~CGoods()" << std::endl;
delete[] mname;
mname = NULL;
}
后面还有
5.取地址操作符的重载函数
6.const修饰的取地址操作符的重载函数
这两个在c++中应用不太常见,因此在这里不做描述;