C++ 类和对象 个人笔记

类和对象的使用

定义对象

class
{
private:
public:
}sn;//无类名直接定义对象  基本无用
class student
{
private:
	int num;
	string name;
	char sex;
public:
	void display()
	{
		cout << num;
		cout << name;
		cout << sex;
	}
}s1;//声明同时定义对象
student s2;//类名定义对象
class student s3;//class 类名 定义对象

类外定义成员函数

class student
{
private:
	int num;
	string name;
	char sex;
public:
	void display();

};
void student::display()
{
	cout << num;
	cout << name;
	cout << sex;
}

“ :: ”为作用域限定符/作用域运算符
若无“ :: ”或“ :: ”前无类名,则为普通函数

内置成员函数

  • 若成员函数在类中定义,C++系统自动对其作为内置(inline)函数处理,即已被隐式声明
  • 若成员函数在类外定义,则不默认为内置函数,需显示声明才能指定为内置函数
  • !注意:若在类体外定义inline函数,则必须将类定义和成员函数的定义放于同一头文件(或写于同一源文件)。否认则编译时无法进行置换
  • 一般只有在类外定义的成员函数规模很小且调用频率较高时才inline处理

对象指针

指向对象的指针

  • 对象空间的起始地址就是对象的指针
Time * pt; //设已定义Time类
Time t1;
pt = &t1;

指向对象成员的指针

  • 可在雷类外通过指针访问公用对象数据成员
int * p1;
p1 = &t1.hour;

指向对象成员函数的指针

Time * p2 = &t1;
p2->get_time();
void (Time:: *p3) ();   //定义指向Time类公用成员函数的指针变量p3
p3 = &Time::get_time(); //使p3指向Time类公用成员函数get_time
(t1. *p3)();   //调用对象t1中p3

this指针

  • 指向本类对象的指针,值是当前调用的成员函数所在对象的起始地址
  • 静态成员函数没有this指针

共用数据的保护

常对象

  • 定义常对象必须同时对它初始化,一旦创建则不能改变
  • 常对象只能调用它的常成员函数,而不能调用它的普通函数(except由系统隐式掉用的构造和析构函数)
  • 常成员函数可以访问常对象的数据成员,但不允许修改常对象中数据成员的值
类名 const 对象名(实参表);
const 类名 对象名(实参表);
const Time t1(12,12,12);//定义常对象
void get_Time() const;//将函数声明为const
mutable int count;//编程时需要一定要修改常对象数据成员时可用mutable声明

常对象成员

常数据成员

  • 只能通过构造函数的参数初始化列表对常数据成员初始化
  • const数据成员可被const成员函数和非const成员函数引用

常成员函数

  • 只能引用本类中的数据成员,而不能修改它们
  • 常成员函数不能掉用另一个非const成员函数
类型名 函数名(参数表) const;

指向对象的常指针

  • 常指针指向不变
类名 * const 指针变量名 = &对象名
Time * const ptr1 = &t1;

指向常对象的指针变量

  • 如果一个变量已被声明为常变量,则只能用指向常变量的指针指向它
    指向
const 类型名 * 指针变量名
const char * ptr;

当希望对象的值不被修改,则应把形参定义为指向常对象的指针变量,同时用对象的地址作实参(对象可以时const或非const)

对象的常引用

const Time & t1 = t;//t1是Time类对象t的引用,二者指向同一储存空间,t值不能改变

静态成员(static)

静态数据成员

  • 在内存中只占一份空间,值对该类所有对象都一样
  • 程序开始运行时被分配空间,程序结束时才释放
  • 必须在类体外初始化,不能用参数初始化列表对静态数据成员进行初始化
  • 可通过对象名类名引用
设已定义了student类
static int count;//声明静态成员数据
int student::count =  0;//类体外初始化
sutdent a;
cout << a.count << endl;//通过对象名引用
cout << student::count << endl;//通过类名引用

静态成员函数

  • 是类的一部分,而不是对象的一部分.类外调用公用(public)静态(static)成员函数要用类名和域运算符(也允许通过对象名调用静态成员函数)
  • 静态成员函数没有*this指针,因此不能访问本类的非静态成员
  • 可直接引用本类的静态成员
  • 静态成员函数主要用来访问静态数据成员而不访问非静态成员
  • 公用成员函数可引用本对象中的非静态数据成员,也可引用类中的静态数据成员
  • 好习惯:只用静态成员函数引用静态数据成员,而不引用非静态数据成员
假设已定义一个student类
static float average();//声明静态成员函数
float student::average(){...}//类外定义
student::average();//类外调用静态成员函数
student s;
s.average();//通过对象名调用静态成员函数

友元(friend)

友元函数(一般函数/非成员函数)

  • 友元函数可以访问该类的私有成员
设已定义Time类
friend void display(Time &);//类体内声明友元函数

友元成员函数

设已定义Date类
friend void Time::display(Date &);//声明Time的display为Date的友元函数

友元类

  • B类中所有函数都是A类的友元函数
  • 友元关系是单向而不是双向的
  • 友元关系不能传递
friend classname;//声明友元类

类模板(template)

template <class numtype>//声明一个类模板,虚拟类型名为numtype
class Compare //定义一个比较数值的Compare类
{public:
   Compare(numtype a, numtype b) {x = a; y = b;}//定义构造函数
   numtype max() {return (x > y) ? x : y;}
   numtype min();
 private:
      numtype x, y;
};
template <class numtype>
numtype Compare <numtype>::min()//类模板外定义成员函数
{return (x > y) ? x : y;}
int main()
{
  Compare <int> cmp1(3,7);//类模板实例化
  Compare <float> cmp2(2.5, 3,6);
  Compare <char> cmp3('a', 'A');
  return 0;
}

运算符重载(operator&)

  1. 必须作为成员函数重载
赋值运算符 "="   函数调用运算符 "()"
下标运算符 "[]"  成员运算符 "->"
  1. 只能作为友元函数重载
流插入运算符 "<<"  流提取运算符 ">>"
类型转换运算符
  1. 一般重载为成员函数
单目运算符
  1. 一般重载为友元函数
双目运算符
"+"  "-"  "*"  "/"  "%"

不同数据类型间的转换

转换构造函数

  • 作用:将一个其它类型的数据转换成一个类的对象
  • 只有一个形参
Complex(double r) {real = r; imag = 0;}//将一个double型数据转换成一个复数类的对象

类型转换函数

  • 作用:将一个类的对象转换成另一类型的数据
  • 只能作为成员函数,because转换的主体是本类的对象
  • 函数名前不能指定函数类型,函数没有参数
operator double() {return real;} //将复数类的对象转换成double数据

继承和派生

  • 派生类需要自己的构造函数,派生类构造函数必须使用基类构造函数

  • 派生类不能直接访问基类的私有成员,必须通过基类函数进行访问
    (派生类对象可以使用基类公有成员函数)

  • 派生类构造函数应通过成员初始化列表将基类信息传递给基类构造函数
    (成员初始化列表只能用于构造函数)

  • 派生类应初始化派生类新增的数据成员

  • 基类指针或引用只能用于调用基类函数,不能将基类对象和地址赋给派生类引用和指针

  • 用作基类的类的析构函数应是虚的;

  • 构造函数不能是虚函数

  • 对将被用作基类的类,定义时应将那些要在派生类中重新定义的函数声明为虚的

  • 只有成员才能是虚函数

  • 通常应给基类一个虚析构函数,即使它并不需要

  • Usually,使用对象作为函数参数时,应按引用传递instead of 按值传递(提高效率)若函数不修改对象,应将参数声明为const;

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值