文章目录
一.类的组成
类由函数成员和数据成员组成,数据成员一般声明为私有,私有和保护成员不能通过对象直接访问。但是可以通过函数成员对私有数据成员进行操纵。
二.访问控制权限
访问限定符(access specifier)有三种:
-
public(公共的)
-
private(私有的)
-
和protected(保护的)
第一种说明的成员能从外部通过对象进行访问,后两种说明的成员不能从外部通过对象进行访问。每种说明符可在类体中使用多次。它们的作用域是从该说明符出现开始到下一个说明符之前或类体结束之前结束。
如果在类体起始点无访问说明符,系统默认定义为私有(private)。
访问说明符private(私有的)和protected(保护的)体现了类具有封装性(Encapsulation)
只有公有成员可以通过对象在类外部进行访问
例子:
#include<iostream>
using namespace std;
class CGoods
{
private:
char Name[10];
int Amount;
float Price;
float Total_value;
};
main()
{
CGoods cd;
cd.Price = 10; //Price声明为私有,不能通过对象直接访问
}
三.通过成员函数访问数据成员
类定义的更关键部分是对数据成员的操作,用函数来完成
这样在类中引进了成员函数(member function)或函数成员,也就是函数也成了数据(类)中的一员。类把数据(事物的属性)和函数(事物的行为——操作)封装为一个整体。
- 定义成员函数时,使用作用域解析符(::)来标识函数所属的类.
- 类方法可以访问类的private组件。
3.1实现类的成员函数
方法一:在类的内部定义
#include<iostream>
#include<string.h>
using namespace std;
class CGoods
{
public:
void RegisterGoods(char name[], int amount, float price)
{
strcpy(Name, name);
Amount = amount;
Price = price;
}
void CountTotal()
{
Total_value = Amount * Price;
cout<<"Total_value:"<<Total_value<<endl;
}
void GetName(char name[])
{
strcpy(name, Name);
cout<<"Name:"<<Name<<endl;
}
private:
char Name[10];
int Amount;
float Price;
float Total_value;
};
main()
{
CGoods cd;
char name[12];
cd.RegisterGoods("c++", 4, 24);
cd.CountTotal();
cd.GetName(name);
}
方法二:使用作用域解析符(::)在类的外部定义(最常用的方法)
#include<iostream>
#include<string.h>
using namespace std;
class CGoods
{
public:
void RegisterGoods(char name[], int amount, float price);
void CountTotal();
void GetName(char name[]);
private:
char Name[10];
int Amount;
float Price;
float Total_value;
};
void CGoods::RegisterGoods(char name[], int amount, float price)
{
strcpy(Name, name);
Amount = amount;
Price = price;
}
void CGoods::CountTotal()
{
Total_value = Amount * Price;
cout<<"Total_value:"<<Total_value<<endl;
}
void CGoods::GetName(char name[])
{
strcpy(name, Name);
cout<<"Name:"<<Name<<endl;
}
main()
{
CGoods cd;
char name[12];
cd.RegisterGoods("c++", 4, 24);
cd.CountTotal();
cd.GetName(name);
}
四.创建对象的2种方式
4.3new创建类对象与不new区别
下面是自己总结的一些关于new创建类对象特点:
- new创建类对象需要指针接收,一处初始化,多处使用
- new创建类对象使用完需delete销毁
- new创建对象直接使用堆空间,而局部不用new定义类对象则使用栈空间
- new对象指针用途广泛,比如作为函数返回值、函数参数等
- 频繁调用场合并不适合new,就像new申请和释放内存一样
4.4new创建类对象实例
1、new创建类对象例子:
CTest* pTest = new CTest();
delete pTest;
pTest用来接收类对象指针。
不用new,直接使用类定义申明:
CTest mTest;
此种创建方式,使用完后不需要手动释放,该类析构函数会自动执行。而new申请的对象,则只有调用到delete时再会执行析构函数,如果程序退出而没有执行delete则会造成内存泄漏。
2、 只定义类指针
这跟不用new申明对象有很大区别,类指针可以先行定义,但类指针只是个通用指针,在new之前并为该类对象分配任何内存空间。比如:
CTest* pTest = NULL;
但使用普通方式创建的类对象,在创建之初就已经分配了内存空间。而类指针,如果未经过对象初始化,则不需要delete释放 。
3、new对象指针作为函数参数和返回值
下面是随手写一个例子,不太严谨。主要示意一下类指针对象作为返回值和参数使用。
class CTest { public: int a; };
class CBest { public: int b; };
CTest* fun(CBest* pBest)
{
CTest* pTest = new CTest();
pTest->a = pBest->b;
return pTest;
}
int main()
{
CBest* pBest = new CBest();
CTest* pRes= fun(pBest);
if(pBest!=NULL)
delete pBest;
if(pRes!=NULL)
delete pRes ;
return -1;
}