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

 # include "iostream"
# include "string"
# include "ctime"
# include "cstdlib"
const int Arsize = ;
const int MaxLen = ;
int main()
{
using namespace std;
string name;
cout << "Hi,what's your name?\n>>";
cin >> name; cout << name << ",please enter up to " << Arsize
<< "short saying<empty line to quit>:\n";
string sayings[Arsize];//说明这里出现了什么问题
char temp[MaxLen];
int i;
for (i = ; i < Arsize; i++)
{
cout << i + << ":";
cin.get(temp, MaxLen);//cin.get表示的是什么意思
while (cin&& cin.get() != '\n') //注意这里的判别用法
continue;
if (!cin || temp[] == '\n') //说明直接输入“enter”按键则程序会退出
break;
else
sayings[i] = temp;
}
int total = i; if (total > )
{
cout << "Here are your saying:\n";
for (i = ; i < total; i++)
cout << sayings[i] << "\n"; string * shortest = &sayings[];//定义了指针并初始化
string * first = &sayings[];//定义了指针并初始化
for (i = ; i < total; i++)
{
if (sayings[i].length() < shortest->length())
shortest = &sayings[i];
if (sayings[i] < *first)
first = &sayings[i];
}
cout << "shortest saying :\n" << *shortest << endl;
cout << "first alphabetically :\n" << *shortest << endl;
srand(time());
int choice = rand() % total;
string * favorite = new string(sayings[choice]);//使用new定义了指针
cout << "my favorite saying:\n" << *favorite << endl;
delete favorite;
}
else
cout << "Not much to say,eh?\n";
cout << "Bye.\n";
system("pause");
return ;
}

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

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

 #include <iostream>
using namespace std;
main ()
{
char a[];
cin.get(a,);
cout<<a<<endl;
} 输入:jkl jkl jkl
输出:jkl jkl jkl 输入:abcdeabcdeabcdeabcdeabcde (输入25个字符)
输出:abcdeabcdeabcdeabcd (接收19个字符+1个'\0')

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

我们需要重点关注的是:

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

要理解这段代码的含义:

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

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. 《Java大学教程》—第7章 类的实现

    统一建模语言(UML)用方框代表类.方框被分成3部分,第一部分是类名,第二部分是类的属性,第三部分是类的方法.类的属性(属性名称:属性类型):类的方法(方法名称(参数类型):返回值类型).静态的类的属 ...

  2. 第一次使用Open Live Writer维护BlogJava

    换了电脑,又重装了一堆东西,现在才把Open Live Writer整好.顺便记下几个心得: Open Live Writer已经没办法从网站上下载了,介绍个方法,可以把地址直接拷贝到迅雷里面,然后请 ...

  3. C#基础知识之Partial class

    C# 2.0 可以将类.结构或接口的定义拆分到两个或多个源文件中,在类声明前添加partial关键字即可. 例如:下面的PartialTest类 class PartialTest { string ...

  4. cookie保存登录的用户名和密码

    用cookie保存登录的用户名和密码,当用户访问网站的时候,获取cookie的用户名和密码,通过用 用cookie保存登录的用户名和密码,当用户访问网站的时候,获取cookie的用户名和密码,通过用户 ...

  5. A1制作文件夹目录

    第一步 在文件夹目录下建立bat文件,填写以下内容: dir *.* /B >目录.txt 最后双击bat文件. 第二步 运行后复制目录.txt文件内容到空白excel 使用hyperlink函 ...

  6. 移动HTML5前端性能优化指南

    概述 1. PC优化手段在Mobile侧同样适用 2. 在Mobile侧我们提出三秒种渲染完成首屏指标 3. 基于第二点,首屏加载3秒完成或使用Loading 4. 基于联通3G网络平均338KB/s ...

  7. mysql锁2

    死锁: 指两个事务或者多个事务在同一资源上相互占用,并请求对方所占用的资源,从而造成恶性循环的现象. 出现死锁的原因: 系统资源不足: 进程运行推进的顺序不当: 资源分配不当. 产生死锁的四个必要条件 ...

  8. ubantu下Navicat乱码的问题

    在官网下载的最新版的Navivat12出现的乱码情况 解决方法:Navicat的文件夹中找到start_navicat用vim编辑,在export LANG=“en_US.UTF-8”这句话改为exp ...

  9. 008_Node中的require和import

    一.js的对象的解构赋值 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Destructuri ...

  10. Spring配置中的"classpath:"与"classpath*:"的区别研究(转)

    Spring配置中的"classpath:"与"classpath*:"的区别研究(转)   概念解释及使用场景: classpath是指WEB-INF文件夹下 ...