一、面向对象的特点
抽象、封装、继承、多态
二、类的封装
1.struct和class的区别
struct定义类时,成员默认属性为public
class定义类时,成员默认属性为private
2.类的访问控制权限
public:可在类内和类外被访问
private:只能在类内被访问
protected:只能在类内和派生类内被访问
class Circle
{
public:
void setR(double r)//类的成员函数 设置圆的半径
{
m_r = r;
}
double getR()//获取圆的半径
{
return m_r;
}
double getS()//获取圆的面积
{
m_s = 3.14 * m_r * m_r;
return m_s;
}
private:
double m_r, m_s;//圆的半径,面积
};
int main()
{
Circle c1;// 用类来定义变量 我们一般将这个变量叫对象
c1.setR(10);
cout << "r=" << c1.getR() << endl;
cout << "s=" << c1.getS() << endl;
system("pause");
return 0;
}
一般将类的声明放在头文件,类的实现放在源文件
3.构造与析构
构造函数:是与类名相同的成员函数,定义时可有参数,没有返回值
析构函数:在对象销毁时自动调用。语法:~ClassName()
4.对象初始化与赋值
Test t1(4,5);
Test t2 = Test(5,6); // 对象的初始化,在创建时给值
t2 = t1; // 对象的赋值
5.拷贝构造函数
定义:
classname (const classname &obj)
{
//调用时用obj.xxx
}
拷贝构造函数的调用时机:
(1)Test t2 = t1; // 用对象 t1 去初始化t2
(2)Test t2(t0); // 用对象 t0 去初始化t2
(3)PrintObj(t0); // 做函数参数的时候
(4)t1 = test(); // 函数返回值返回对象
6.当类中没有定义构造函数时,C++编译器会提供默认无参构造函数和默认拷贝构造函数。
先调用成员变量的构造函数,调用顺序与声明顺序相同,再调用自身类的构造函数。
析构函数调用顺序与对应构造函数顺序相反
三、内存的动态建立和释放 new delete
new申请空间并调用构造函数初始化指针指向的内容
指针变量 = new 类型(常量); //常量是初始化值,可缺省。数组不能指定初始值。
指针变量 = new 类型 [ 表达式 ] ;
delete释放空间并调用对象的析构函数
delete 指针变量 ; //指针变量必须是一个new返回的指针
delete [ ] 指针变量 ;
例:int *p = new int(3); //开辟一个存放整型数的空间,并指定该实数的初值为3,将返回该空间的地址赋值给指针p
如果执行new运算时内存不足,会返回0指针值。
例:(1)基础类型的空间分配
int main()
{
int *p1 = new int(); //常量缺省
*p1 = 30;
int *p2 = new int(30); //直接初始化
cout << "p1 = " << *p1 << endl;
cout << "p2 = " << *p2 << endl;
delete p1;
delete p2;
system("pause");
return 0;
}
(2)数组的空间分配
int *p1 = new int[10];
p1[2] = 30;
cout << p1[2] << endl;
delete[] p1; //漏掉[]会造成内存泄漏
(3) 类对象的空间分配
MyPoint *p = new MyPoint(3, 4);
cout << p->getX() << " " << p->getY();
delete p;
四、静态成员变量和静态成员函数
1.静态成员变量
static关键字可以说明一个类的成员:static int m_x;
静态成员必须在类的外部初始化:int MyPoint :: m_x = 10;
MyPoint p1(1, 1);
MyPoint p2(1, 1);
cout << p1.m_z << endl;//静态成员可以直接通过对象访问
p1.m_z = 10;
cout << p2.m_z << endl;//输出10
MyPoint::m_z = 90;//静态成员也可以通过类名访问
2.静态成员函数
静态成员函数中只能使用静态成员变量,不能使用其他普通成员变量。
static void printC()
{
cout << m_c << endl;
}
Test::printC();//类名::函数名调用
p1.printC();//用对象调用
五、this指针
在构造函数初始化时:
MyPoint::MyPoint( int x, int y )
{
this->m_x = x;//相当于m_x = x;
this->m_y = y;//相当于m_y = y;
}
六、const修饰成员函数
函数名后面加const,则函数体内部不能改变任何成员变量
int get() const
{
return i;
}