每天学点c++之七——const对象,const函数,析构函数

来源:互联网 发布:欧洲文献检索数据库 编辑:程序博客网 时间:2024/06/01 17:31
一、const对象和const函数
1 const 对象就是在对象前面加const关键字修饰。
2 const 函数是指在成员函数的参数列表之后,实现体之前加const修饰。注意是成员函数。
3 const对象必须进行初始化。
4 在类里面const函数和非const函数之所以能够形成重载关系,是因为编译器在编译的时候,为这两个不同的函数生成了不同的函数名。以下实例。
5 注意const对象才能访问const函数,非const对象优先调用非const函数,如果没有非const函数,那么才调用const函数。
6 const函数中只能读成员变量,不能修改成员变量的值,也不能掉用非const的成员函数(这是因为非const函数可以修改成员变量的值,和前面两句规则相反)。如果非要在const函数中去修改成员变量,只要在要修改的成员变量上加一个mutable修饰。const修饰在类的成员函数的尾部,表示这个函数不会修改类的成员。相当于this指针是const的。const 函数一般用于类中,在函数声明后加const 表示 const *this;  把this指针变为const型。
7 static成员函数只能访问static成员变量。这是因为static成员函数和static成员变量都不属于某个对象,而是属于一个类,这样就把static修饰的变量的作用域范围扩大了,这和c语言中的static成员有些类似(数据存放在全局区),这就造成了这样一个现象,如果static成员函数中调用了一个非static成员变量,在没有定义一个对象的情况下,就不会产生实际的非static变量空间,而又可以直接用无命名空间的方式(::)访问static成员函数,这样static成员函数访问了一个不存在的变量。所以static成员函数只能调用static变量,非static成员函数可以调用任意类型的成员变量。注意static成员函数和变量都是先于其他普通类型而生成的。另外全局static成员函数和成员变量都有防止跨文件访问的功能。


  1 #include<iostream>
  2 using namespace std;
  3 class A
  4 {
  5 public:
  6   // _ZN1A4showEv,汇编生成的函数名
  7   void show()
  8   {
  9     cout << "show()" << endl;
 10   }
 11   // _ZNK1A4showEv,汇编生成的函数名
 12   void show() const
 13   {
 14     cout << "show() const" << endl;;
 15   }
 16 private:
    int data;
 17 };
 18 int main()
 19 {
 20   A var_a;
 21   var_a.show();
 22   const A var_b = var_a; // 注意const对象必须初始化。
 23   var_b.show();
 24   return 0;
 25 }

在C语言中,static的字面意思很容易把我们导入歧途,其实它的作用有三条。
(1)第一个作用:隐藏。
当我们同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性。为理解这句话,我举例来说明。我们要同时编译两个源文件,一个是a.c,另一个是main.c。
下面是a.c的内容
#include<cstdio>增加这条语句
char a = ‘A‘; // global variable
void msg()
{
     printf("Hello\n");
}
你可能会问:为什么在a.c中定义的全局变量a和函数msg能在main.c中使用?前面说过,所有未加static前缀的全局变量和函数都具有全局可见性,其它的源文件也能访问。此例中,a是全局变量,msg是函数,并且都没有加static前缀,因此对于另外的源文件main.c是可见的。
如果加了static,就会对其它源文件隐藏(这一特性就是防止跨文件访问,也就是说只能在内部使用)。例如在a和msg的定义前加上static,main.c就看不到它们了。利用这一特性可以在不同的文件中定义同名函数和同名变量,而不必担心命名冲突。Static可以用作函数和变量的前缀,对于函数来讲,static的作用仅限于隐藏,而对于变量,static还有下面两个作用。
(2)static的第二个作用是保持变量内容的持久。存储在静态数据区的变量会在程序刚开始运行时就完成初始化,也是唯一的一次初始化。共有两种变量存储在静态存储区:全局变量和static变量,只不过和全局变量比起来,static可以控制变量的可见范围,说到底static还是用来隐藏的。
(3)static的第三个作用是默认初始化为0。其实全局变量也具备这一属性,因为全局变量也存储在静态数据区。在静态数据区,内存中所有的字节默认值都是0x00,某些时候这一特点可以减少程序员的工作量。
最后对static的三条作用做一句话总结。首先static的最主要功能是隐藏,其次因为static变量存放在静态存储区,所以它具备持久性和默认值0


c++的类类面,首先要进行对static修饰的变量的声明,然后在类外进行定义和初始化。
总结为什么会有普通变量,全局变量,static变量,const变量,const函数,static函数。

二、析构函数。
    3.1 析构函数和构造函数同名,前面多了一个~,这个函数是无参的,所以一个类型中只有一个析构函数。
    3.2 析构函数可以在一个对象销毁之前自动调用。如果成员变量都是普通变量,那么函数调用结束就会弹栈,但是如果变量是存放在堆内存中的,那么函数调用结束之后仍然不能回收资源,所以必须有析构函数。还有释放socket描述符,数据库链接等等资源。
    3.3 注意析构函数和构造函数都是自动调用的,析构函数可以手动调用,但是会造成系统出错。
    3.4 内存相关的四个操作
        1构造函数分配内存
        2析构函数释放内存
        3深拷贝问题(后面会讲),也就是内存的独立性问题
        4

#include<iostream>
using namespace std;
class A
{
   int *data;
public:
     // 构造函数中分配内存
    A():data(new int(10))
    {
      cout << "A()" << endl;
    }
   // 析构函数中释放内存
   ~A()
   {
     cout << "~A()" << endl;
     delete data;
   }
 };
 int main()
 {
   A* pa = new A[5];
   delete[] pa;
   A a;
 }
0 0
原创粉丝点击