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\n",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;
}

  

posted @ 2018-06-01 21:00  晓乎  阅读(435)  评论(0编辑  收藏  举报
总访问: counter for blog 次