C++primer 第十二章 类

一、类的定义方式

有以下两种,第一种name是私有的,第二种name是公有的。

<一>

class person

{

    string name;

}

<二>

struct person

{

    string name;

}

二、初始化

默认构造函数初始化值

A、对于类类型的数据成员,采用其默认构造函数进行初始化

B、对于内置类型的数据成员,如果数据成员是全局的或者是静态的,则初始化为0;如果数据成员是局部的,则不对其进行初始化,因此,对于内置类型的数据成员,如果要使用则需要首先对其初始化。

C、构造函数如果指定了默认实参,则可以用作默认构造函数,但是不能同时具有两个有默认实参的构造函数,这样会造成函数二义性。

构造函数

没有默认构造函数的类类型的成员以及const或者引用类型的成员,必须要在构造函数中进行初始化:因为const或者引用类型的成员仅可以在声明时初始化,不可以进行赋值。

类成员的显示初始化

只有没有定义构造函数并且全部的数据成员均为public时,类才可以采用与初始化数组元素相同的方式初始化成员

三、构造函数定义的隐式转换

例子:

class Sales_item

{

    explicit  Sales_item(const string &is);

}

class item

{

 public:

    same_isbn(Sales_item);

}

对于上述例子,item.same_isbn("aaaa");则是正确的使用,因为Sales_item的构造函数隐式的可以将"aaaa"转换为值为"aaaa"的Sales_item类,为了避免这种情况的产生,我们可以在构造函数前加explicit,从而使编译器不使用该构造函数作为转换操作符。

四、名字查找

1、类成员声明所用到的名字查找

只检查该声明之前的类内部所用的声明和包含类的作用域的声明

2、类成员定义中用到的名字查找

检查类内部所有的成员,不仅限于定义之前。以及包含类的作用域的声明。

五、友元

作用域:

仅友元声明在类内部,则将已命名的类或者非成员函数引入到外围作用域中;同时友元函数定义如果在类中,则函数的作用域也可以扩展到包围该类定义的作用域中。

六、static类成员

static成员是类的组成部分,但不是任何对象的组成部分

1、static数据成员

注意,static数据成员不是通过类构造函数进行初始化的!必须在类定义体的外部定义,且正好一次,可以通过将static数据成员放在包含类的非内联成员函数定义的文件中。static数据成员除了const static int型数据成员可以在类的内部初始化,其余的均不可以再类内部初始化。

例子1:

class Person
{
private:
    string name;
    static int age;
public:
    Person(const string&nm):name(nm)
    {}
    void Print()
    {
        cout<<name<<" is "<<age<<endl;
    }
};
int Person::age=20;

static成员它不像普通的数据成员,static数据成员独立于该类的任意对象而存在,每个static数据成员是与类关联的对象,并不与该类的对象相关联!这句话可能比较拗口,其实可以这么理解:每个static数据成员可以看成是类的一个对象,而不与该类定义的对象有任何关系!对于static成员的类型可以是该成员所属的类的类型,但是非static成员是类的一部分,就不能将类定义为其类型,如2所示;对于static类型可以作为实参使用,而对于非static则不可以做为实参,因为它的值不能脱离类,如3所示.

例子2

Class Bar

{

private:

   static Bar mem1;//正确,类型可以是类的类型,因为static不是类的一部分

   Bar mem2;

   //不正确,因为mem2时类的一部分,所以不能使用Bar作为其类型,只能写作引用或者指针形式 Bar *mem2

};

例子3

class Screen

{

public:

     Screen & clear(char=bkground);

private:

    static const char bkground="#";

};

2、static成员函数

a、声明时指明是static,定义时无须重复指定static保留字。

b、static成员函数不能被生命为const,因为声明为const就是承诺不会修改该函数所属的对象,但是static函数并不属于任何类,因此不能被声明为const。

注意:

1、 成员函数的重载:成员函数只能重载本类中的其他成员函数,类的成员函数和普通的非成员函数以及在其他类中声明的函数不相关,也不能重载他们。

2、在类内部定义的成员函数默认为iinline成员函数。同时也可以显示的在类内部声明或者外部定义时指定函数为inline函数。

3、this指针:

普通的类成员函数中,this是一个指向类类型的const指针,可以改变指针指向的数据,不可以改变this保存的地址;

const成员函数中,this是一个指向const类类型对象的const指针,这样容易导致长表达式中出现const调用问题:

如:display()是一个类的const调用,set是非const调用,定义非const类myScreen,则myScreen.display().set()是错误的,因为display返回的是指向const类型类的const指针。

4、为了解决长表达式中的const调用问题,提出给予const的重载:

5、为了实现在类中修改数据成员,我们可以将他们声明为mutable类型,这样即使是cons成员函数也可以对其进行修改,因为mutable类型永远不能为const。

6、对于定义在外部的类的成员函数,形参表和成员函数体都是在类的作用域中,可以直接使用类的数据成员;但是返回类型却不在类的作用域中。因为形参表和成员函数在成员函数名之后出现,而返回类型则出现在成员函数名之前。

7、一定要记得定义类相当于语句,要加分号,因为在类的定义后可以接一个对象定义列表。

8、类初始化时一个函数{}后面不应该加分号。

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值