• C++学习总结(2)


    1、const指针

    指向常量的指针变量,其一般形式为 "const 类型名 * 指针变量名 " 。 如下:

    int a=12,b=15;
    const int *p=&a;
    int *q=&b;
    *p=22;	//非法,试图通过p修改a的值
    *q=22;	//一般的指针变量可以修改,合法
    p=&b;	//p改为指向b,合法。

    2、引用

      对于数据可以建立一个“引用”,它的作用是为变量起另一个别名。

    int main()
    {
    	int a=5;
    	int &b=a;
    	printf("%d
    ",b);
    }
    

      以上声明了b是a的引用,即b是a的别名,这样声明后,a和b的作用是相同的,都代表同一变量。可以这样去理解:通过b去引用a。在上面的声明中,"&"是引用声明符,不代表地址。

    需要注意几点:

    1. 引用是一种独立的数据类型。对引用只有声明,没有定义。即必须先定义一个变量,然后对该变量建立一个引用。
    2. 声明一个引用,必须同时使之初始化,即声明它代表哪一个变量。
    3. 声明另一个变量后,不能再使之作为另一个变量的引用。
    4. 不能建立引用数组如:
      int main()
      {
      int a[5];
      int &b[5]=a;	//错误,不能建立引用数组
      int &b=a[0];	//错误,不能作为数组元素的别名
      }
    5. 不能建立引用的引用。
      int main()
      {
      	int a=3;
      	int &b=a;
      	int &c=b;	//建立引用的引用,错误
      }
    6. 可以取引用的地址,如声明b是a的引用,则&b就是变量a的地址。
      int main()
      {
      	int *pt;
      	pt=&b;	//把变量a的地址&a赋给指针变量pt
      }

    3、运算符new和delete

      C++提供了较简便而功能强大的运算符new和delete来代替malloc和free函数,因此最好不用malloc和free;

    int main()
    {
    	int m=3,n=4,i;
    	int **a  =  new int*[m];  //分配一个指针数组,将其首地址保存在a中   、
    	for(i = 0; i < m; i++)   //为指针数组的每个元素分配一个数组
           a[i] = new int [n];
    	//动态声明的数组,使用后需要释放内存。
    	for(i = 0;i < m; ++i)
    		delete [] a[i];
    	delete []a;
    	return 0;
    }
    

    4、对象指针

      1、指向对象的指针是指向对象空间起始地址的指针,其形式和一般的变量的指针定义一样。

    class Time
    {
    public:
    	int hour;
    	int minute;
    	int sec;
    	Time(int h,int m,int s):hour(h),minute(m),sec(s){};
    	void getTime();	//类的成员函数
    };
    
    void Time::getTime(){
    	cout<<hour<<":"<<minute<<":"<<sec<<endl;
    };
    
    int main()
    {
    	Time *pt;
    	Time t(16,58,59);
    	pt=&t;
    	pt->getTime();
    	return 0;
    }
    

     2、指向成员函数的指针

      普通函数的指针变量一般形式如下: 类型名 (*指针变量名)(参数列表)。如下:

    void fun(){
    	cout<<"hello world"<<endl;
    }
    int main(){
    	void(*p)();    //p是指向void型函数的指针变量
    	p=fun;		   //将fun函数的入口地址赋给指针变量p,p就指向fun函数
    	(*p)();		   //函数调用。
    	return 0;
    }
    

      而定义一个指向对象成员函数的指针变量则比较复杂一些,一般采用下面这样的方式:

        数据类型名 (类名 :: *指针变量名)(参数列表);

       可以让他指向一个公用成员函数,只须把公用函数的入口地址赋给指向公用函数的指针变量即可。其一般形式如下:

        指针变量名=&类名 :: 成员函数名;

    class Time
    {
    public:
    	int hour;
    	int minute;
    	int sec;
    	Time(int h,int m,int s):hour(h),minute(m),sec(s){};
    	void getTime();	//类的成员函数
    };
    
    void Time::getTime(){
    	cout<<hour<<":"<<minute<<":"<<sec<<endl;
    };
    int main(){
    	Time t(20,31,30);
    	Time *p=&t;
    	p->getTime();		//通过对象指针来指向函数
    	void(Time::*p1)();	//定义直接指向Time类公用函数的指针p1
    	p1=&Time::getTime;	//将P1指向公用函数getTime
    	(t.*p1)();			//调用对象的成员函数
    	return 0;
    }
    

      在main函数中的

    p1=&Time::getTime;

      不能写成一下形式,

    p1=&t.getTime;

      原因如下:成员函数不是存放在对象的空间中的,而是存放在对象外的空间中的。如果有多个同类的对象,它们公用同一段函数代码段。因此赋给指针变量的p3应该是这个公用函数代码段的入口地址,而不是通过变量对象地址获得来的函数入口。

    5.struct和class的区别

    最近一段时间在做实验室的一个项目,其中涉及到对Postgresql源码的修改操作,因为它时C写的的,平常习惯使用Java和C++,虽然很多人说C++是C的扩充,但两者(面向对象和面向过程)的开发逻辑还是有很大的不同,在此将C,C++中常用的struct以及C++的class做一个对比。

    C和C++中的struct

      因为C这种面向过程的风格,strcut作为一种数据类型被使用,因此,在struct中不能包含任何函数,同时,面向过程的编程认为,数据和数据操作者是分开的,在struct中不能给struct中的成员变量赋初始值。

      在C++中,struct因为面向对象的特性,得到了很大的扩充:

    1. 可以对成员变量进行赋值操作。
    2. 可以包含成员函数
    3. 可以实现继承。
    4. 可以实现多态。

      如下代码示例:

    //C++
    struct A
    {
    char a = 's';
    };
    struct B : A
    {
    char b;
    };

    strcut和class的区别

      1.默认的继承访问权。class默认的是private,strcut默认的是public。

    struct A
    {
        int x;
    };
    
    struct B: A   //共有继承
    {
        int y;
    };
    
    class C: A    //私有继承
    {
        int z;
    };
    
    int main(){
        B b;
        b.x = 6;    //正确 
        C c;
        c.x = 8;    //错误
    }

      2.默认访问权限:struct作为数据结构的实现体,它默认的数据访问控制是public的,而class作为对象的实现体,它默认的成员变量访问控制是private的。

    struct A
    {
        int x;
    };
    class B
    {
        int y;
    };
    
    
    int main()
    {
    
    
        A a;
        a.x = 6; //可以在类外访问成员变量,struct默认是公有的
        B b;
        b.y = 8; //在类外无法访问私有变量,class默认是私有的
        return 0;
    }

      

  • 相关阅读:
    排序之插入排序
    swfupload在chrome中点击上传图片按钮无反应的解决办法
    ASP.NET网站限制访问频率
    SQL 合并列值和拆分列值
    替换字符串第一次出现的某个字符
    HttpWebResponse远程服务器返回错误: (500) 内部服务器错误
    撒列实现关键字过虑
    sql关键字过滤C#方法
    WebRequest 对象的使用
    Request 分别获取具有相同 name 属性表单元素值
  • 原文地址:https://www.cnblogs.com/helloworldcode/p/9121018.html
Copyright © 2020-2023  润新知