C++中的对象指针总结

指向对象的指针
在建立对象的时候,变异系统会给每一个对象分配一定的存储空间,以存放其成员。
对象空间的起始地址就是对象的指针。可以定义一个指针变量,用来存放对象的指针。

一个简单的示例1.1:


代码如下:

#include<iostream>
using namespace std;
class Student
{
 public:
  int num;
  int score;
  Student(int ,int );//声明构造函数
  void Print();//声明输出信息函数
};
Student::Student(int n,int s)
{
 num=n;
 score=s;
}
void Student::Print(){
 cout<<num<<"\t"<<score<<endl;
}
int main(){
 Student stud(1,100);//实例化一个对象
 Student *p=&stud;//定义一个指向对象的指针,并使用对象stud的地址初始化
 cout<<"*p.num:"<<(*p).num<<endl;//使用指向对象的指针调用数据成员的方式一
 cout<<"p->score:"<<p->score<<endl;//使用指向对象的指针调用数据成员的方式二
 (*p).Print();
 p->Print();
 return 0;
}

指向对象成员的指针
对象有地址,存放对象初始地址的指针变量就是指向对象的指针变量。
对象中的成员也有地址,存放对象成员地址的指针变量就是指向对象成员的指针变量。

1.指向对象数据成员的指针
定义指向对象数据成员的方法和定义指向普通变量的方法相同:
数据类型    *    指针变量名


代码如下:

p=&t1.hour;//将对象t1的数据成员hour的地址赋给p,p指向t1.hour
cout<<*p<<endl;//输出t1.hour的值

2.指向对象成员函数的指针
定义指向成员函数的指针和定义指向普通函数的指针的方法是不同的。

定义指向普通函数的指针的方法是这样的:
数据类型名(* 指针变量名)(参数列表);
如:


代码如下:

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()


代码如下:

stud.(*p);//作用与stud.Print()的作用等价

=================一个使用对象指针的例子1.2===========


代码如下:

#include<iostream>
using namespace std;
class Student
{
 public:
  int num;
  int score;
  Student(int ,int );
  void Print();
};
Student::Student(int n,int s)
{
 num=n;
 score=s;
}
void Student::Print(){
 cout<<num<<"\t"<<score<<endl;
}
int main(){
 Student stud(1,100);
 cout<<"stud.Print()"<<endl;
        stud.Print();//直接调用对象stud的成员函数Print();
 Student *p_class=&stud;//定义指向对象stud的指针;
 cout<<"p_class->Print()"<<endl;
 p_class->Print();//通过指向对象的指针调用成员函数Print();
 void (Student::*p_fun)();//声明p_fun是指向Student中的函数的指针
 p_fun=&Student::Print;//是p_fun指向Student类公用成员函数Print()
 cout<<"(stud.*p_fun)()"<<endl;
 (stud.*p_fun)();//调用对象stud中的p_fun所指向的成员函数(即:stud.Print)
 return 0;
}

this指针
每个对象中的数据成员都分别占用存储空间,如果对同一个类定义了n个对象,则有n组同样大小的空间一存放n个对象中的数据成员。
单数不同的对象都调用同一段函数代码段。
那么,当不同对象的成员函数引用数据成员时,怎么能保证引用的是所制定的对象的数据成员呢?
实际上,在每一个成员函数中,都包含一个特殊的指针,这个指针的名字是固定的,称为this指针。
它是指向本类对象的指针,它的值是当前被调用的成员函数所在的对象的起始地址。

例如:
Print()函数中


代码如下:

cout<<num<<"\t"<<score<<endl;

实际上是


代码如下:

cout<<this->num<<"\t"<<this->score<<endl;

this指针式隐式使用的,它是作为参数被传递给成员函数。
在程序中的函数:


代码如下:

void Student::Print(){
 cout<<num<<"\t"<<score<<endl;
}

C++编译系统会自动处理成:


代码如下:

void Student::Print(Student *this){
 cout<<this->num<<"\t"<<this->score<<endl;
}

即在成员函数的形参表列中增加一个this指针。在调用成员函数stud.Print()时,实际上是用以下方式调用的:


代码如下:

stud.Print(&stud);

(0)

相关推荐

  • 用C++面向对象的方式动态加载so的方法

    这几天在写一个server,由于框架相同,仅仅是获取数据源的地方有区别,所以,研究了一下如何使用面向对象的方法来动态加载so. 主要思想就是: 1.通过一个函数能够获得一个基类的指针,这样在调用基类的函数的时候,就能自动调用子类的实现了. 2.存储so对象的指针应该是外层类的一个static变量. 详细还是看代码吧: 1)首先定义一个公共的头文件,里面存储的基类的定义:(需要注意的就是,只要不是纯虚函数,那么就一定要有实现:还有就是析构函数需要为虚函数) so和主调程序都需要包含这个头文件. s

  • C++实现动态分配const对象实例

    本文实例讲述了C++实现动态分配const对象的方法.分享给大家供大家参考.具体方法分析如下: 一.创建 在C++中,允许动态创建const对象,格式如下: const int *p = new const int(128); 与其他常量一样,动态创建的const对象必须在创建时初始化,并且初始化后,其值不能改变. 二.删除 尽管不能改变const对象的值,但可以删除动态创建的const对象,格式如下: delete p; 这个和普通的对象一样,可以对其进行删除操作. 三.应用场景举例 1.加载

  • C++如何动态的生成对象详解

    前言 可能说起C++大多数人都觉着难学,其实我也是这么觉着的,在这个移动端火到爆的时代,我都想改行了,移动端做东西那都是现有的第三方库,拿来就可以用,而且稳定性好,开发速度快,而且最关键的是出东西.再谈一谈动态生成对象,为什么强大的C++不支持呢?想用这样功能的人都必须自己实现一套这样的逻辑. 实现理由 有时候开发真是有些矛盾,例如:1.实现一个功能可以使用大量相似的代码.也可以使用模板,那我们怎么选择呢? 2.如果实现一个类之后,他有大量的属性,而且这些属性都需要set和get方法,那么我们还

  • C++中对象的赋值与复制操作详细解析

    对象的赋值 如果对一个类定义了两个或多个对象,则这些同类的对象之间可以互相赋值,或者说,一个对象的值可以赋给另一个同类的对象.这里所指的对象的值是指对象中所有数据成员的值. 对象之间的赋值也是通过赋值运算符"="进行的.本来赋值运算符"="只能用来对单个的变量赋值,现在被扩展为两个同类对象之间的赋值,这是通过对赋值运算符的重载实现的. 实际上这个过程是通过成员复制来实现的,即将一个对象的成员值一一复制给另外一个对象的成员.对象赋值的一般形式: 对象名1=对象名2;

  • C++中对象的常引用、动态建立和释放相关知识讲解

    C++对象的常引用 我们知道,一个变量的引用就是变量的别名.实质上,变量名和引用名都指向同一段内存单元. 如果形参为变量的引用名,实参为变量名,则在调用函数进行虚实结合时,并不是为形参另外开辟一个存储空间(常称为建立实参的一个拷贝), 而是把实参变量的地址传给形参(引用名),这样引用名也指向实参变量. [例] 对象的常引用. #include <iostream> using namespace std; class Time { public: Time(int,int,int); int

  • C++对象的动态建立与释放详解

    =============下面先给出一个new和delete基本应用的例子,回顾一下它的基本用法============ 复制代码 代码如下: #include<iostream>using namespace std;int main(){ int *p;//定义一个指向int型变量的指针p  p=new int(3);//开辟一个存放整数的存储空间,返回一个指向该存储空间的的地址  cout<<*p<<endl; delete p;//释放该空间  char *p_

  • C++中的函数指针与函数对象的总结

    篇一.函数指针函数指针:是指向函数的指针变量,在C编译时,每一个函数都有一个入口地址,那么这个指向这个函数的函数指针便指向这个地址. 函数指针的用途是很大的,主要有两个作用:用作调用函数和做函数的参数. 函数指针的声明方法:数据类型标志符 (指针变量名) (形参列表):一般函数的声明为: int func ( int x );而一个函数指针的声明方法为:int (*func) (int x);前面的那个(*func)中括号是必要的,这会告诉编译器我们声明的是函数指针而不是声明一个具有返回型为指针

  • C++面向对象实现五子棋小游戏

    尽量将面向对象的思想融入进程序中 ChessBoard.h //ChessBoard.h #pragma once #define ROW 15 #define COL 15 #include<iostream> using namespace std; class ChessBoard//棋盘类 { public: char m_cSquare[ROW][COL]; public: ChessBoard(); void show(); }; ChessBoard.cpp //ChessBoa

  • C++用new创建对象和不用new创建对象的区别解析

    我们都知道C++中有三种创建对象的方法,如下: 复制代码 代码如下: #include <iostream>using namespace std; class A{private:    int n;public:    A(int m):n(m)    {    }    ~A(){}}; int main(){    A a(1);  //栈中分配    A b = A(1);  //栈中分配    A* c = new A(1);  //堆中分配 delete c;    return

  • 详解C++中的对象指针与对象数组

    C++对象指针 指向对象的指针 在建立对象时,编译系统会为每一个对象分配一定的存储空间,以存放其成员.对象空间的起始地址就是对象的指针.可以定义一个指针变量,用来存放对象的指针. 如果有一个类: class Time { public : int hour; int minute; int sec; void get_time( ); }; void Time::get_time( ) { cout<<hour<<":"<<minute<<

  • C++中的对象指针总结

    指向对象的指针在建立对象的时候,变异系统会给每一个对象分配一定的存储空间,以存放其成员.对象空间的起始地址就是对象的指针.可以定义一个指针变量,用来存放对象的指针. 一个简单的示例1.1: 复制代码 代码如下: #include<iostream>using namespace std;class Student{ public:  int num;  int score;  Student(int ,int );//声明构造函数  void Print();//声明输出信息函数};Stude

  • 详解C++中的this指针与常对象

    C++ this指针详解 this 是C++中的一个关键字,也是一个常量指针,指向当前对象(具体说是当前对象的首地址).通过 this,可以访问当前对象的成员变量和成员函数. 所谓当前对象,就是正在使用的对象,例如对于stu.say();,stu 就是当前对象,系统正在访问 stu 的成员函数 say(). 假设 this 指向 stu 对象,那么下面的语句中,this 就和 pStu 的值相同: Student stu; //通过Student类来创建对象 Student *pStu = &s

  • C++ 中引用与指针的区别实例详解

    C++ 中引用与指针的区别实例详解 引用是从C++才引入的,在C中不存在.为了搞清楚引用的概念,得先搞明白变量的定义及引用与变量的区别,变量的要素一共有两个:名称与空间. 引用不是变量,它仅仅是变量的别名,没有自己独立的空间,它只符合变量的"名称"这个要素,而"空间"这个要素并不满足.换句话说,引用需要与它所引用的变量共享同一个内存空间,对引用所做的改变实际上是对所引用的变量做出修改.并且引用在定义的时候就必须被初始化.     参数传递的类型及相关要点: 1 按值

  • C++ 中const对象与const成员函数的实例详解

    C++ 中const对象与const成员函数的实例详解 const对象只能调用const成员函数: #include<iostream> using namespace std; class A { public: void fun()const { cout<<"const 成员函数!"<<endl; } void fun() { cout<<"非const成员函数 !"<<endl; } }; int

  • 浅谈JavaScript中的this指针和引用知识

    this是javascript的一个关键字,随着函数使用场合不同,this的值会发生变化.但是总有一个原则,那就是this指的是调用函数的那个对象. this指针在传统OO语言中,是在类中声明的,表示对象本身.在JavaScript中,this表示当前上下文,即调用者的引用 ********this永远指向的是(函数对象)的所有者 this和全局对象: var a = 1; function foo(){ var b = 2; console.log(this.a+b);//3 } foo();

  • iOS对象指针和基础数据类型的强转详解

    本文主要介绍了iOS中对象指针和基础数据类型如何进行强转,下面话不多说,直接来看示例详解. 一.对象指针的强转: UIView *view = [UIView new];//new一个UIView类的对象 UILabel *label = (UILabel *)view;//强转成UILabel指针 label.text = @"123";//给label的text属性赋值(调用label的setText方法) 上述代码会产生崩溃,崩溃信息如下: -[UIView setText:]:

  • IOS 开发之Object-C中的对象详解

    IOS 开发之Object-C中的对象详解 前言 关于C语言的基础部分已经记录完毕,接下来就是学习Object-C了,编写oc程序需要使用Foundation框架.下面就是对oc中的对象介绍. 对象 对象和结构类似,一个对象可以保存多个相关的数据.在结构中,我们称这些数据为成员.而在对象中,称这些数据为实例变量.除了这些以外,对象和结构不用之处在于,对象还可以包含一组函数,并且这些函数可以使用对象所保存的数据,这类函数称为方法. 类 类(class)负责描述某个特点类型的对象,其中包括方法和实例

  • C++ 中引用和指针的关系实例详解

    C++ 中引用和指针的关系实例详解 1.引用在定义时必须初始化,指针没有要求 int &rNum; //未初始化不能通过编译 int *pNum; //可以 2. 一旦一个引用被初始化为指向一个对象,就不能再指向 其他对象,而指针可以在任何时候指向任何一个同类型对象 int iNum = 10; int iNum2 = 20; int &rNum = iNum; &rNum = iNum2; //不能通过 3. 没有NULL引用,但有NULL指针. int *pNum = NULL

随机推荐