c++基本概念

来源:互联网 发布:window 命令启动软件 编辑:程序博客网 时间:2024/06/05 09:21

1. 类的声明与对象的定义

    常用的方法是类的声明与对象的定义分开

2.成员访问限定符private,public,protected的含义

   private:只能被类的成员函数访问,类外不能被访问(友元除外)

   public:可以被类的成员函数访问,也可以被类的作用域内的其它函数访问

   protected:在类外不能被访问,但可以被派生类的成员函数访问。

3.成员函数:可以访问本类的任何成员(包括私有和公有的),可以引用在本作用域有效的数据

  注意:它的权限(能否被调用),作用域(能使用什么范围内的数据和函数)

  一般做法:需要被外界调用的函数声明为pblic作为类的对外接口,并非所有的成员函数都指定为public,不是准备为外界调用,而是为本类的成员函数调用,就应该将它们指定为private

成员函数的存储方式:

    类定义对象时,系统会为每个对象分配存储空间。如果对象包含数据和成员函数,就要分别为数据和成员函数分配存储空间。一般情况下,不同类型的数据分配的存储空间是不同的,而不同对象的函数代码是相同的。如果为每个对象的函数分配存储空间,就会浪费许多存储空间。于是就用一段空间来存储这个共同的函数代码段,在调用各对象的函数时,都去调用这个公用的函数代码。在这种情况下,每个类的对象的存储空间只是该对象的数据部分的存储空间,不包括函数代码所占的存储空间。函数代码是存储在对象空间之外的。于是就产生一个问题:虽然不同的对象调用成员函数都执行同一段代码,但其执行结果一般是不同的。这是为什么?因为c+设立了一个this指针,用来指向不同的对象

 

成员函数的inline声明的作用:在调用该函数时,将函数的代码段插入到调用点。若不用inline声明,则调用该函数时,流程就会转到函数代码段的入口地址,在执行完函数代码时,返回调用点

 

 

4.公用接口与私有实现分离

   类的作用:把数据和算法封装在用户声明的抽象数据类型。在类的声明中,一般把所有的数据成员指定为私有的,使它们与外界隔离。把需要让外界调用的成员函数指定为pulic,外界通过公用的函数实现对数据的操作。外界与对象唯一的联系渠道就是通过调用公用函数。因此,公有成员函数也称为用户使用类的公用接口,即类对外的接口。不一定要把所有的成员函数声明为pulic,那么这些函数就不是公用接口。用户只关心功能,而不关心实现,这样就实现了接口和实现的分离。通过成员函数对数据操作称为类的实现。为了防止用户任意修改公有成员函数,实现的细节对用户是隐蔽的,即私有实

 

5.类库:分为C++标准库和用户自定义的库,方便编译

  类库包含2个组成部分:类声明头文件,已经过编译的成员函数的定义(目标文件)。用户只需将类库装入计算机系统中,然后包含要使用的头文件,即可使用这些类和成员函数。类声明头文件就成为用户使用类的公用接口,在头文件的类体中还可以看到成员函数的声明。包含成员函数的文件就是类的实现。

 

接口和实现分离,为软件开发商向用户提供类库创造了很好的条件。开发商把用户所需的各种类的声明放在不同的头文件中,同时把对包含成员函数的定义的源文件进行编译,得到函数定义的目标代码。然后向用户提供类的声明的头文件和成员函数定义的目标代码(不提供函数定义的源代码)

 

6.构造函数(constructor)和析构函数(destructor)

 

  在类对象进入其作用域时就会调用构造函数。构造函数没有返回值,函数名与类名相同,其作用是对对象进行初始化。构造函数是定义对象时系统自动调用的,且只执行一次。构造函数一般声明为pulic.构造函数不能被显示的调用

如果用户没有定义构造函数,那么C++系统会自动生成一个构造函数。只是这个构造函数的函数体为空,没有参数,不执行初始化操作。

 

带参数的构造函数: 参数的初始化表

如box(int len,int w,int h ):length(len),height(h),width(w){}//len初始化成员变量length......

构造函数重载:

默认构造函数:不带实参的构造函数。一个类只能有一个默认构造函数

 

析构函数:当对象的生命期结束时,会自动调用析构函数。如~box()。析构函数不能被重载,一个类只能有一个析构函数。其作用不是删除对象,而是在撤销对象占用的内存之前完成清理工。

 

执行析构函数的具体情况:

   1.在函数中定义一个对象(自动局部对象),函数定义结束时,对象自动释放。在释放前自动调用析构函数;2.static局部对象在函数调用结束时并不释放,因此不调用析构函数。只在main()结束或调用

exit()函数结束程序时,才调用static局部对象的析构函数;3.若定义一个全局对象,当离开其作用域时(main()结束或调用exit()),调用析构函数;4.new运算符动态建立一个对象,用delete释放对象时,先调用析构函数

 

构造函数与析构函数调用的顺序:对于同一类的存储类别,析构函数调用的顺序与构造函数相反。即先构造后析构。不同类的存储类别,如上(析构函数的具体情况)

 

7.对象数组和对象指针

 

this指针:在每个成员函数中都包含一个特殊的指针,this指针,它是指向本类对象的指针。它的值是当前被调用的成员函数所在对象的起始地址。this指针是隐式使用的,它是作为参数传递给成员函数的

如 int box ::valum()

{

   return height*width*length

}

C++把它处理为

int box::valum(box *this)

{

   return (this->height)*(this->width)*(this->length);

}

 

8.const对象,const变量,const指针

在定义变量时,加上const关键字,则变量的值在程序运行期间不能改变,这种变量称为常变量,即const变量,如:const int a = 3;定义常变量时必须初始化,且它的值不能在改变。常变量不能出现在赋值的左边。从计算机实现的角度看,常变量是在变量的基础上加上限制:存储单元的值不能变化。因此常变量又称为只读变量

const变量是从应用的角度提出的,如有时要求某些变量的值不允许改变(某些函数的参数),这时就用const加以限制

 

常对象:const Time t1(22,10,10)//常对象必须初始化,对象t1所有成员的值都不能改

 

const对象不能调用非const成员函数

 

如何引用const对象的成员呢?将函数声明为const即可 

 如 void get_time() const (常或const成员函数

 

常对象成员:常数据成员和常成员函数

       常数据成员的值不能改变。只能通过构造函数的参数初始化表对常数据成员,不能采用构造函数对常数据成员进行赋

       如果将成员函数声明为常成员函数,只能引用本类的数据成员,不能修改它们。常成员函数在声明和定义时都要用const ,调用时不必加const

       const数据可以被const成员函数引用,也可以被非const成员函数引用

       const成员函数可以引用const数据成员,也可以引用非const数据成员

 

       如果对象被定义为常对象,只能调用其中的const成员函数。不要误认为const对象的成员函数都是const成员函数。const对象只能保证其数据成员是const数据,其值不能被修改。如果const对象的成员函数没有const关键字,编译系统把它作为非const成员函数处理。

 

const指针:一个指针固定的与一个对象相联系,常用来做函数的形参

      在C++程序设计中,常用const指针和const 引用做函数的形参,这样既能保证数据安全,在调用函数时又不必建立实参的拷贝

      调用函数建立实参的拷贝时,都要调用复制拷贝构造函数,有时间开销。用const指针和const引用做函数形参,可以提高程序运行效率

 

对象的动态建立和释放:new 和delete运算符