我们想 像使用基本数据类型一样使用类,自然,类自然也有指针,我们通过下面的代码来领教一下对象指针存在的意义:

  1. # include "iostream"
  2. # include "string"
  3. # include "ctime"
  4. # include "cstdlib"
  5. const int Arsize = ;
  6. const int MaxLen = ;
  7. int main()
  8. {
  9. using namespace std;
  10. string name;
  11. cout << "Hi,what's your name?\n>>";
  12. cin >> name;
  13.  
  14. cout << name << ",please enter up to " << Arsize
  15. << "short saying<empty line to quit>:\n";
  16. string sayings[Arsize];//说明这里出现了什么问题
  17. char temp[MaxLen];
  18. int i;
  19. for (i = ; i < Arsize; i++)
  20. {
  21. cout << i + << ":";
  22. cin.get(temp, MaxLen);//cin.get表示的是什么意思
  23. while (cin&& cin.get() != '\n') //注意这里的判别用法
  24. continue;
  25. if (!cin || temp[] == '\n') //说明直接输入“enter”按键则程序会退出
  26. break;
  27. else
  28. sayings[i] = temp;
  29. }
  30. int total = i;
  31.  
  32. if (total > )
  33. {
  34. cout << "Here are your saying:\n";
  35. for (i = ; i < total; i++)
  36. cout << sayings[i] << "\n";
  37.  
  38. string * shortest = &sayings[];//定义了指针并初始化
  39. string * first = &sayings[];//定义了指针并初始化
  40. for (i = ; i < total; i++)
  41. {
  42. if (sayings[i].length() < shortest->length())
  43. shortest = &sayings[i];
  44. if (sayings[i] < *first)
  45. first = &sayings[i];
  46. }
  47. cout << "shortest saying :\n" << *shortest << endl;
  48. cout << "first alphabetically :\n" << *shortest << endl;
  49. srand(time());
  50. int choice = rand() % total;
  51. string * favorite = new string(sayings[choice]);//使用new定义了指针
  52. cout << "my favorite saying:\n" << *favorite << endl;
  53. delete favorite;
  54. }
  55. else
  56. cout << "Not much to say,eh?\n";
  57. cout << "Bye.\n";
  58. system("pause");
  59. return ;
  60. }

首先注意第16行的代码:使用string类定义了字符串数组,注意我们使用string 定义字符串而不是用c风格的char p[]来定义字符串有诸多的好处:因为string类中既包含了科学的内存管理,同重载了+ ,==,!=,>...这些运算符,来方便我们像使用一般变量一样使用类对象。我们需要形成这样一种意识:即定义的类应该具有重载基本运算符的功能,同时我们即使不知道string能够重载这些,也要站在类的角度,认识到运算符重载对于一般类属性的意义。

cin.get(字符数組名,接收字符数目)用來接收一行字符串,可以接收空格,如下图:

  1. #include <iostream>
  2. using namespace std;
  3. main ()
  4. {
  5. char a[];
  6. cin.get(a,);
  7. cout<<a<<endl;
  8. }
  9.  
  10. 输入:jkl jkl jkl
  11. 输出:jkl jkl jkl
  12.  
  13. 输入:abcdeabcdeabcdeabcdeabcde (输入25个字符)
  14. 输出:abcdeabcdeabcdeabcd (接收19个字符+1'\0'

注意:我们即使是在对象中使用指针,也同样具有&表示取地址,*表示取值,同时通过指针调用方法仍然是->。44行的<很明显是被重载了。

我们需要重点关注的是:

  1. string * favorite = new string(sayings[choice]);//使用new定义了指针
  2. cout << "my favorite saying:\n" << *favorite << endl;
  3. delete favorite;

要理解这段代码的含义:

  1. new string(sayings[choice]); 是指新开辟了一个内存空间为新的类对象的空间(而这个对象没有取名字),而这个类对象被sayings[choice]初始化,
    随后让favorite指向了这块内存空间
    需要在意的是delete favorite执行时,也就是说favorite指向的内存空间要被销毁,那么也就意味着临时对象要被销毁。之前说过:对象在销毁时会调用析构函数,
    因为执行delete favorite,删除了相应的内存区域,但同时因为对象的销毁,使得析构函数也被调用
  2.  
  3. 我们提出一个题外问题:
    我们知道cinistream类的一个对象,但平常我们在使用普通类对象的时候,我们必须先定义这个对象:class A,但cin似乎并不需要我们定义成istream cin,而可以直接用,
    那么我们是否可以采用 诸如istream shuru,这样新生成的对象来替代cin 呢,如果不能又是为什么呢???
    当我们试图定义:istream shuru;来替代cin时,程序报错,并提示我们:istream不存在默认构造函数。所以我们无法使用istream来定义新的对象。
  1.  

c++ 入门之对象指针的更多相关文章

  1. es6 快速入门 系列 —— 对象

    其他章节请看: es6 快速入门 系列 对象 试图解决的问题 写法繁杂 属性初始值需要重复写 function createPeople(name, age){ // name 和 age 都写了 2 ...

  2. delete 类对象指针的注意事项]

    http://blog.csdn.net/infoworld/article/details/45560219 场景:1. C++类有构造和析构函数,析构函数是在类对象被delete时(或局部变量自动 ...

  3. C++:向函数传递对象(对象、对象指针、对象引用)

    3.5.1   使用对象作为函数参数,其方法与传递基本类型的变量相同 //例3.21 使用对象作为函数参数 #include<iostream> using namespace std; ...

  4. C++:对象指针

    对象指针概念:每一个对象在初始化后都会在内存中占有一定的空间.因此,既可以通过对象名访问, 也可以通过一个对象地址来访问一个对象.对象指针就是用于存放对象地址的变量. 声明对象指针的一般语法格式为:类 ...

  5. 对象指针与this指针

    对象指针分为三大类 [1]指向对象的指针 [2]指向对象成员的指针(数据类) [3]指向对象成员的指针(函数类) #include<iostream> using namespace st ...

  6. MFC通过对话框窗口句柄获得对话框对象指针

       C***Dialog* pWnd= (C***Dialog*)FromHandle(hWnd); //由句柄得到对话框的对象指针    pWnd->xxx( );              ...

  7. c++ 对象指针参数和对象引用参数02

    对象指针作为函数参数和对象引用作为函数参数都比对象作为函数参数要用的更为普遍 传对象指针和传对象引用作为实参,那么实参在函数里发生了变话,那么相应的对象本身也会发生变化,二传递对象本身作为实参的话,实 ...

  8. c++对象指针-01(转载)

    1.指向对像的指针在建立对像时,编译系统会为每一个对像分配一定的存储空间,以存放其成员,对像空间的起始地址就是对像的指针.可以定义一个指针变量,用来存和对像的指针.如果有一个类:class Time{ ...

  9. 值为NULL的对象指针

    相信大家对NULL不会很陌生,NULL 是一个标准规定的宏定义,用来表示空指针常量,当一个指针变量被赋值为NULL时,表示它不再指向任何有效地址,无法在访问任何数据.在VS2012库文件stdio.h ...

随机推荐

  1. 如何获取Azure AD tenant的tenant Id?

          一般情况下,Azure AD用户知道自己tenant域名,因为域名是账户的后缀,例如:contoso.onMicrosoft.com.如果你还不了解什么是Azure AD tenant,可 ...

  2. 第二章 基础查询 2-1 SQL语句基础

    一.列的查询 基本的SELECT语句: SELECT <列名 >,...... FROM < 表名>; 注:子句是SQL的组成要素. 注:查询结果中的列的顺序和SELECT子句 ...

  3. 初识kafka

    简介     Kafka经常用于实时流数据架构,用于提供实时分析.本篇将会简单介绍kafka以及它为什么能够广泛应用. kafka的增长是爆炸性的.2017年超过三分之一的世界五百强公司在使用kafk ...

  4. unix2dos和dos2unix处理换行问题

    今天同事QQ给发来一个文件内容如下: 希望把文件内容转换为update table_name set col_name=第一列 where col_name=第二列;这种SQL格式,使用UE列模式秒秒 ...

  5. visual studio 启动无法打开IIS express

    删除 解决方案下的vs文件夹之后重新生成

  6. ASP.NET -- WebForm -- Session的使用

    ASP.NET -- WebForm --  Session的使用 Session是服务器端状态保持机制. 1. Test4.aspx文件与Test4.aspx.cs文件 <%@ Page La ...

  7. Nginx+Keepalived双机热备

    一.Keepalived Keepalived是保证集群高可用的服务软件.网络中优先级高的节点为master负责响应VIP的ARP包,将VIP和MAC地址映射关系告诉网络内其他主机,还会以多播的形式向 ...

  8. 假设在本地搭一个server和mysql数据库环境,假设使用java来訪问数据库

    我们能够使用speedamp来搭一个server环境,能够在http://download.csdn.net/detail/baidu_nod/7630265下载 解压后无需安装直接能够使用.点击Sp ...

  9. DataGrid获取单元格的值

    string str = (dataGrid.Columns[0].GetCellContent(dataGrid.Items[0]) as TextBlock).Text;

  10. 【vue】vue中ref用法

    1.获取当前元素: 例子: <div class="pop pos-a" :style="{ left: pop_x + 'px' ,top: pop_y + 'p ...