C++学习笔记31——类的基础概念

1,声明和定义构造函数时不能写返回类型,否则报错;

2,定义成员函数时,返回类型放在最前面,然后才是类的作用域,const限定符(如果需要的话)放在花括号前面;

3,public, private与protected访问标号

      public之后定义的成员称为公有成员,可以由程序的所有部分访问;

      private之后定义的成员称为私有成员,只能由本类(的成员函数)访问;

      protected之后定义的成员称为保护成员,只能由本类及本类的后代类访问。

      访问标号持续有效,直到遇到下一个访问标号或结构体定义的右花括号为止。

      class关键字定义的类,默认是private的;struct关键字定义的类,默认是public的。

4,const成员函数:

      不能改变其所操作的对象的数据成员。

      const必须同时出现在声明和定义中,若只出现在其中一处就会报编译错误。


5,构造函数的初始化列表

      Person() :name(""), address("") {}
      初始化列表跟在构造函数的形参表(上面的例子里的是空形参表)之后,并以冒号开头。

      初始化的顺序是按照类中成员定义的顺序,而不是按照初始化列表中成员出现的顺序。

      初始化数据成员与对数据成员赋值的含义是什么?有什么区别?
      首先把数据成员按类型分类并分情况说明:
     1.内置数据类型,复合类型(指针,引用)
         在成员初始化列表和构造函数体内进行,在性能和结果上都是一样的
     2.用户定义类型(类类型)
         结果上相同,但是性能上存在很大的差别。因为类类型的数据成员对象在进入函数体前已经构造完成,也就是说在成员初始化列表处进行构造对象的工作,

        调用构造函数,在进入函数体之后,进行的是对已经构造好的类对象的赋值,

        又调用个拷贝赋值操作符才能完成(如果并未提供,则使用编译器提供的默认按成员赋值行为) 

6,数据抽象:注重类型接口的编程技术,数据抽象允许程序员忽略类型如何表示的细节,而只考虑该类型可以执行的操作。

7,封装:实现与接口的分离,封装隐藏了类型实现的细节。C++用private实现封装。

8,类中的typedef:

class Screen
{
public:	
	typedef std::string::size_type index;//在类外可使用这个新名字
	char get()const { return contents[cursor]; }
	char get(index ht, index wd)const; //重载get
	Screen(string new_contents, index new_cursor,index new_width, index new_height) 
	{
		contents = new_contents;
		width = new_width;
		height = new_height;
	}
	
private:
	string contents;
	index cursor;
	index height,width;
};

这个类中用typedef定义了一个名为index的局部类型名字,这个定义放在public中,所以在程序的任何地方,包括类外都可以使用这个名字。

注意,在类外部使用时要加上域操作符。

	/*******************************************************************/
	//       验证在类中使用typedef
	/*******************************************************************/
	Screen::index cursor = 2; //index为在类中定义的别名
	Screen::index width  = 3;
	Screen::index height = 4;
	Screen MyScreen("HuangYang Love WHY", cursor, width, height);

	cout << MyScreen.get(0, 3) << endl;

9,inline成员函数

直接在类中定义的函数为隐式的inline成员函数。

还可以将函数显示声明为inline,但是在类中只声明,不定义,然后在类外定义该函数。这样虽然是在类外定义的,但其仍然为inline函数。

对于显式的inline函数需要注意:

(1)inline关键字,既可以出现在类中的声明里,也可以出现在类外的定义里,还可以两个地方都写;

(2)inline成员函数的定义应该与类的定义放在同一头文件中,而不是像普通的成员函数那样放在源文件中,因为inline成员函数必须在每个调用该函数的源文件中都可见;

10,类的声明

可以声明一个类而不定义它。

class class_Y;//声明一个类
class class_X
{
private:
	class_Y *y;
};

这种声明又称为前向声明,在声明之后、定义之前,该类是一个不完全类型。既已知它是一个类,但不知道它包含哪些成员。

对于不完全类型,不能定义该类型的对象,只能用于定义指向该类型的指针及引用,或者用于声明(而不是定义)使用该类型作为形参类型或返回类型的函数

在类中定义不完全类型的数据成员也是非法的,但可以定义指向不完全类型的对象的指针。即如上例所示。

由此也可推出:

类不能具有自身类型的数据成员,但是可以有指向自身类型的指针或引用。





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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值