6、类

1、类的基本思想:数据抽象、封装。数据抽象:分离接口(定义和声明用户能执行的操作)和实现(数据成员、接口函数体的实现)。

2、编译器先编译成员的声明,后编译成员函数体,无论这些成员出现的顺序。

3、this是指向类的指针,*this即类。

4、const

//函数isbn为const
//这里的const把this转换为常量指针,因为没有修改类的成员
string isbn() const {return bookNo;}

5、类的成员函数可以定义在类外

//这里My_class::表明函数属于类my_class
int My_class::func() const 
{
    ......
}

6、构造函数:初始化类对象的成员,名字和类相同,没有返回值。构造函数可以在构造过程中向const对象写值,因为构造函数执行完,该对象才具有常量属性。

//:bookNo(s), units_sold(0),revenue(0),冒号后面为每个成员的初始化及bookNo=s...
//其它即函数体,Sales_data(const std::string &s){}

class Sales_data{
    Sales_data()=default;//因为Sales_data有另一个构造函数,所有本函数是必须的
    Sales_data(const std::string &s):bookNo(s), units_sold(0),revenue(0){}

}

7、访问控制和权限
struct和class都可以定义类,区别在于struct默认权限。struct默认public,class默认private(类的成员函数可以访问)

class My_class{

//friend 声明某些外部函数可以访问private成员
friend std::istream &read(std::istream&, Sales_data&);
public:
    ......
private:
    .....
};

8、可变数据成员
mutable,永远不会是const,即使它是const对象的成员

mutable int a;

9、返回类

class Screen{
public:
    Screen &set(char);
};
//这里inline (Screen &)Screen::set(char c)
//返回类型为引用即操作的是本身,而你不是拷贝类
//这就是返回类和类的引用的区别
inline Screen &Screen::set(char c)
{
    contents[cursor] = c;
    return *this;
}

my_screen.move(4,0)返回类型为Screen &即类本身

Screen my_screen;
my_screen.move(4,0).set('#');

10、static
(1)静态成员函数不与任何对象绑定在一起(它属于类而非具体类的对象,但是可以通过对象.静态成员的方式访问),静态成员函数不能声明为const,而且不能在static函数体内使用this指针。

(2)在类的外部定义静态成员不能重复static关键字

(3)静态成员必须在类的外部定义和初始化每个静态成员,智能定义一次。类里面用static声明。

11、聚合类
只含有共有成员,没有类内初始化值,没有构造函数。成员可以用花括号初始化列表进行初始化。

12、

  1. 在创建对象之前,类中说明的数据成员并不占用内存空间。定义类时不能给数据成员赋值(除static成员)。
class A
{
    int x = 0;//错
    const double y = 0.0;//错
}
  1. 类中定义其他类对象(除类指针和引用外),定义的类必须有完整定义,只声明不行。
class A;//只声明不行
class B
{
    A a;//错未见A定义
    B b;//错B未定义完

    //对
    A *p1;
    B *p2;
    A &q1;
    B &q2;
}

13、类的成员函数描述了类中定义的数据成员所能实施的操作。把成员函数的定义放在类中是建议编译程序按内联函数处理。类的每个对象的数据成员都有其对应的内存空间,类中成员函数只有一个空间。

14、成员初始化表中成员初始化的书写次序不决定它们的初始化次序,数据成员的初始化次序由它们在类中的声明次序来决定。当类中有常量数据成员和引用数据成员时,一定在构造函数的成员初始化表中对它们进行初始化。

class A
{
    int x;
    const int y;
    int &z;
public:
    A():x(0),z(x),y(1)//次序:x为0,y为1,z为x的引用
    {
    }
}

15、在创建一个对象时,用同类另一个对象对其初始化,需要调用拷贝构造函数。如果在类定义中没有给出拷贝构造函数,则编译程序将会为其提供一个隐式的拷贝构造函数,该拷贝构造函数的行为是逐个成员拷贝初始化。

//其中const可以省略,加上的目的是为了防止在函数中修改实参对象
<类名>(const <类名>&)

class A
{
    public:
        A();
        A(const A& a);
}

三种情况会用到拷贝构造函数

  • 定义对象时
A a1;
A a2(a1);//用到
  • 把对象作为值参数传给函数
void f(A x);
A a;
f(a);//用到
  • 把对象作为返回值时
A f()
{
    A a;
    return a;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值