C++学习笔记第一篇

来源:互联网 发布:横截面数据举例 编辑:程序博客网 时间:2024/05/30 22:49

1.1 类与对象

含义:类是一种复杂的自定义数据类型。对象是属于这种数据类型的变量


1.1.1 类的定义与实现

1)定义:

C++将对象的属性抽象为数据成员,将对象的行为抽象为成员函数,并将他们封装在一个类里

class  <>

{

        private:(只允许被本类的成员函数访问或调用);

        public:(本类或其他类);

        protected:(本类或派生类);

};

一般而言,数据成员定义为private属性,成员函数定义为public属性,在声明成员时如果省略了访问权限控制符,默认为private。

2)实现

成员函数的定义形式与一般函数的基本相同,但如果在类的外部定义成员函数,必须在成员函数名前加上类名和作用域限定符(::)

一般将类的定义放在头文件中,实现放在源文件中,main函数放在另一个源文件中。

声明对象后,就可以像引用结构变量一样,利用成员运算符 “." 或指向运算符 "->" 引用对象的公有成员,但注意不能引用对象的非公有成员。


1.1.2 构造函数与析构函数

1)对对象的初始化

在声明对象时,对象需要初始化,即对成员变量的初始化。

在定义类时不能直接对成员变量进行初始化(因为不能确定类中定义和初始化的成员变量属于哪一个对象)。

也不能在声明对象时直接通过赋值运算进行初始化(因为成员变量一般都是私有属性,只允许本类的成员函数访问)。

2)构造函数

构造函数是一种特殊的成员函数,在创建对象时系统自动调用,作用在于:对象被创建时利用初始值去构造函数,使得在省明对象时就能自动地完成对对象的初始化

因此初始化方法除了在调用成员函数时进行赋值运算,一般通过构造函数进行初始化。

3)析构函数

也是一种特殊的成员函数,它是在对象的生存期即将结束时自动调用的,作用:在对象被删除前做一些清理工作和数据保存工作。

注意:

1,构造函数和解析函数不能有返回值,void也不行,而且解析函数没有参数。

2,析构函数调用顺序一般与构造函数相反,因为是在栈中为对象分配内存空间。

3,可以定义多个不同的构造函数但只调用一次,通过函数参数的不同来区别不同的构造函数。


1.1.3 静态成员

1)实力属性和类属性

一般情况下,属于同一个类的不同对象的数据成员所占用的空间是不同的,及数据成员在每一个对象中都有一个备份。因此不同的对象可以具有不同的属性值,这种属性成为实例属性。有些情况下某个数据成员的值对每个对象都是相同的,称为类属性,即静态数据成员。

注意:

1,对于公有静态数据成员,除了可以像一般数据成员那样直接通过对象或在成员函数里访问,还可以用类名加作用域限定符来访问。对于私有和保护属性的,只能在成员函数里访问。

2,静态数据成员不属于任何一个对象,故不可用构造函数进行初始化,必须在类体外进行初始化。

2) 静态成员函数

1,在声明对象前访问静态数据成员必须声明一个静态成员函数,静态成员函数与一个类相关联,而不是一个特定的对象。

2,可以通过对象或在其他成员函数中调用静态成员函数,也可以用类名加::访问。但其只能访问静态成员。


1.1.4 this指针

每个成员函数都隐藏有一个名为this的指针的参数,他是一个特殊的指针,指向调用成员函数的对象。当通过一个对象调用成员函数时,编译器要把对象的地址传给this指针。在成员函数中访问数据成员或调用其它成员函数时不需要指定对象,因为他们都有一个隐藏的this指针确定当前对象。

在一个成员函数中经常需要调用其他非本类的成员函数,而有时需要吧当前对象的地址作为参数传递给被调用函数,这是必须使用this指针。

静态成员函数没有this指针。


1.1.5友元

此处省略,详见p81


1.1.6常对象和常对象成员

1)const常对象

常对象的数据成员的值在对象的整个生存期内不能被改变,必须利用构造函数进行初始化,且以后不能再更新。(但实际还是可以更新)。

2)常成员函数

1,常成员函数中只能调用常成员函数;

2,通过常对象只能调用常成员函数;

3,通过普通对象可以调用常成员函数。

3)常数据成员

任何函数都不能对它进行赋值,其初始值只能通过构造函数获取。







0 0