C++中的指针与引用
2014-04-28 22:28
169 查看
1.对象指针和一般的指针的大小都只与操作系统有关,32位系统就是4字节,64位就是8字节
2.c++ 在建立对象的时候 ,会给对象的每一个成员变量分配一定的储存空间,以存放其成员(注意字节对齐问题)
3.所以一个对象的大小 就是其成员变量的总大小
4.指向对象成员的指针
p=&t1.hour;//将对象t1的数据成员hour的地址赋给p,p指向t1.hour
cout<<*p<<endl;//输出t1.hour的值
6.定义指向成员函数的指针和定义指向普通函数的指针的方法是不同的。
定义指向普通函数的指针的方法是这样的:
数据类型名(* 指针变量名)(参数列表);
如:
void (*p)(int n,int m);//p是指向void型函数的指针变量
p=fun;//将fun函数的入口地址赋给指针变量p,p就指向了函数fun
(*p)(a,b);//调用fun函数,其中,a,b是实参
而定义一个指向对象成员函数的指针变量则比较复杂一些。
如果我们直接按照上面的方法定义指针变量,将对象成员函数名赋给指针变量p:
void (*p)();
p=t1.Print();
编译会出现错误
成员函数与普通函数的一个最根本区别:它是类中的一个成员。
编译系统要求上面的复制语句中,指针变量的类型必须与赋值号右侧函数的类型相匹配,要求在一下3个方面要匹配:
1.函数参数的类型和参数个数
2.函数返回值的类型
3.所属的类
前两个是匹配的,而第三点不匹配。
指针变量p与类无关,而Print()却属于Student类。
要定义指向成员函数的指针变量应该采用以下形式:
void (Student::*p)();//定义p为指向Student类中公共成员函数的指针变量
数据类型名(类名::*指针变量名)(参数表列);
我们知道,所有的Student类实例化得到的对象都是公用一个成员函数的,所以我们没有必要指定它是指向那个对象的成员函数的指针,我们只需要定义它是指向该类的成员函数就可以了。
使指针变量指向一个公用成员函数的一般形式为:
p=&Student::Print;
指针变量名=&类名::成员函数名;
在使用时,仍然需要将指针放到具体的对象中使用,(*p)的作用等价于Print()
7.this指针
每个对象中的数据成员都分别占用存储空间,如果对同一个类定义了n个对象,则有n组同样大小的空间一存放n个对象中的数据成员。
单数不同的对象都调用同一段函数代码段。
那么,当不同对象的成员函数引用数据成员时,怎么能保证引用的是所制定的对象的数据成员呢?
实际上,在每一个成员函数中,都包含一个特殊的指针,这个指针的名字是固定的,称为this指针。
它是指向本类对象的指针,它的值是当前被调用的成员函数所在的对象的起始地址。
C++编译系统会自动处理成:
void Student::Print(Student *this){
cout<<this->num<<"\t"<<this->score<<endl;
}
即在成员函数的形参表列中增加一个this指针。在调用成员函数stud.Print()时,实际上是用以下方式调用的:
stud.Print(&stud);
2.c++ 在建立对象的时候 ,会给对象的每一个成员变量分配一定的储存空间,以存放其成员(注意字节对齐问题)
3.所以一个对象的大小 就是其成员变量的总大小
4.指向对象成员的指针
p=&t1.hour;//将对象t1的数据成员hour的地址赋给p,p指向t1.hour
cout<<*p<<endl;//输出t1.hour的值
6.定义指向成员函数的指针和定义指向普通函数的指针的方法是不同的。
定义指向普通函数的指针的方法是这样的:
数据类型名(* 指针变量名)(参数列表);
如:
void (*p)(int n,int m);//p是指向void型函数的指针变量
p=fun;//将fun函数的入口地址赋给指针变量p,p就指向了函数fun
(*p)(a,b);//调用fun函数,其中,a,b是实参
而定义一个指向对象成员函数的指针变量则比较复杂一些。
如果我们直接按照上面的方法定义指针变量,将对象成员函数名赋给指针变量p:
void (*p)();
p=t1.Print();
编译会出现错误
成员函数与普通函数的一个最根本区别:它是类中的一个成员。
编译系统要求上面的复制语句中,指针变量的类型必须与赋值号右侧函数的类型相匹配,要求在一下3个方面要匹配:
1.函数参数的类型和参数个数
2.函数返回值的类型
3.所属的类
前两个是匹配的,而第三点不匹配。
指针变量p与类无关,而Print()却属于Student类。
要定义指向成员函数的指针变量应该采用以下形式:
void (Student::*p)();//定义p为指向Student类中公共成员函数的指针变量
数据类型名(类名::*指针变量名)(参数表列);
我们知道,所有的Student类实例化得到的对象都是公用一个成员函数的,所以我们没有必要指定它是指向那个对象的成员函数的指针,我们只需要定义它是指向该类的成员函数就可以了。
使指针变量指向一个公用成员函数的一般形式为:
p=&Student::Print;
指针变量名=&类名::成员函数名;
在使用时,仍然需要将指针放到具体的对象中使用,(*p)的作用等价于Print()
7.this指针
每个对象中的数据成员都分别占用存储空间,如果对同一个类定义了n个对象,则有n组同样大小的空间一存放n个对象中的数据成员。
单数不同的对象都调用同一段函数代码段。
那么,当不同对象的成员函数引用数据成员时,怎么能保证引用的是所制定的对象的数据成员呢?
实际上,在每一个成员函数中,都包含一个特殊的指针,这个指针的名字是固定的,称为this指针。
它是指向本类对象的指针,它的值是当前被调用的成员函数所在的对象的起始地址。
C++编译系统会自动处理成:
void Student::Print(Student *this){
cout<<this->num<<"\t"<<this->score<<endl;
}
即在成员函数的形参表列中增加一个this指针。在调用成员函数stud.Print()时,实际上是用以下方式调用的:
stud.Print(&stud);
相关文章推荐
- c语言和c++中值传递、指针传递和引用传递的比较和区别
- C++ 中“空引用”与“空指针”的区别
- c++ 引用和指针
- C/C++中指针和引用之相关问题深入研究
- c++引用与指针的区别
- C++引用和指针的本质差别
- c++学习笔记--指针和引用的比较
- C++学习笔记(五):指针和引用
- C++ 值传递、指针传递、引用传递详解
- 【补足基础】C++中引用传递与指针传递区别【转】
- C++指针、数组、引用、变量作函数参数
- C++中引用传递与指针传递区别
- C++中引用,指针,指针的引用,指针的指针
- C++的引用和指针的区别(&和*)
- 指针和指针的引用作为参数——c++
- 动态创建二维vector数组 C和C++ 及指针与引用的区别
- C++文本查询程序 定义类管理数据 用引用共享数据 不用智能指针 C++Primer练习12.27
- C++指针,数组,引用基础
- c++ 引用 指针与引用的区别
- c++ 指针point 和引用reference的区别