c++ 入门之对象指针
我们想 像使用基本数据类型一样使用类,自然,类自然也有指针,我们通过下面的代码来领教一下对象指针存在的意义:
# 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++ 入门之对象指针的更多相关文章
- es6 快速入门 系列 —— 对象
其他章节请看: es6 快速入门 系列 对象 试图解决的问题 写法繁杂 属性初始值需要重复写 function createPeople(name, age){ // name 和 age 都写了 2 ...
- delete 类对象指针的注意事项]
http://blog.csdn.net/infoworld/article/details/45560219 场景:1. C++类有构造和析构函数,析构函数是在类对象被delete时(或局部变量自动 ...
- C++:向函数传递对象(对象、对象指针、对象引用)
3.5.1 使用对象作为函数参数,其方法与传递基本类型的变量相同 //例3.21 使用对象作为函数参数 #include<iostream> using namespace std; ...
- C++:对象指针
对象指针概念:每一个对象在初始化后都会在内存中占有一定的空间.因此,既可以通过对象名访问, 也可以通过一个对象地址来访问一个对象.对象指针就是用于存放对象地址的变量. 声明对象指针的一般语法格式为:类 ...
- 对象指针与this指针
对象指针分为三大类 [1]指向对象的指针 [2]指向对象成员的指针(数据类) [3]指向对象成员的指针(函数类) #include<iostream> using namespace st ...
- MFC通过对话框窗口句柄获得对话框对象指针
C***Dialog* pWnd= (C***Dialog*)FromHandle(hWnd); //由句柄得到对话框的对象指针 pWnd->xxx( ); ...
- c++ 对象指针参数和对象引用参数02
对象指针作为函数参数和对象引用作为函数参数都比对象作为函数参数要用的更为普遍 传对象指针和传对象引用作为实参,那么实参在函数里发生了变话,那么相应的对象本身也会发生变化,二传递对象本身作为实参的话,实 ...
- c++对象指针-01(转载)
1.指向对像的指针在建立对像时,编译系统会为每一个对像分配一定的存储空间,以存放其成员,对像空间的起始地址就是对像的指针.可以定义一个指针变量,用来存和对像的指针.如果有一个类:class Time{ ...
- 值为NULL的对象指针
相信大家对NULL不会很陌生,NULL 是一个标准规定的宏定义,用来表示空指针常量,当一个指针变量被赋值为NULL时,表示它不再指向任何有效地址,无法在访问任何数据.在VS2012库文件stdio.h ...
随机推荐
- C#委托(转载)
C#委托的介绍(delegate.Action.Func.predicate) from:http://www.cnblogs.com/akwwl/p/3232679.html 委托是一个类,它定义了 ...
- OkHttp简单使用
OkHttp是一个轻量优秀的网络框架.用于替代HttpUrlConnection和Apache HttpClient(android API23 6.0里已移除HttpClient,) 使用方法: 1 ...
- jenkins 备份配置信息
本文介绍几种备份jenkin配置信息的方法,大家可根据实际情况做出选择. 我的测试环境如下: windows 7 jenkins 2.32.3 ____升级到___2.46.3 (长期支持版本) 多种 ...
- linux上部署SpringBoot项目及遇到的问题
打开sftp步骤, 在显示的已连接的窗口上右键, 选择connect SFTP Session就可以打开文件上传的窗口 从windows上传文件到linux, 首先linux需要先切换到想要保存文件的 ...
- 【Teradata】gtwglobal查看
使用root登录TD数据库节点 cnsterm 6 start gtwglobal cnsterm 3 //上一个命令的window编号 h //帮助 QUIT //退出
- UltraISO制作Ubuntu14.04 64bit到U盘文件载入不完整
版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/zinss26914/article/details/37728251 前言 今天新买的Thinkpa ...
- Fiddler抓包学习
今天看到一个抓包笔记, 因为是老早抓包的需求, 后期不用就忘了, 换电脑桌面软件图标都没了, 点开看了一下一脸懵逼... 这是啥... 以后有需要在看一遍吧! Fiddler抓包使用教程-扫盲篇 h ...
- 关于图片的Base64编码
什么是Base64编码 Base64编码是一种图片处理格式,通过特定的算法将图片编码成一长串字符串,在页面上显示的时候,可以用该字符串来代替图片的url属性. base64编码就是长得像下面这样子的代 ...
- 洛谷P1127-词链
Problem 洛谷P1127-词链 Accept: 256 Submit: 1.3kTime Limit: 1000 mSec Memory Limit : 128MB Problem ...
- Ubuntu下软件安装的几种方式,apt,dpkg工具的使用
通常 Linux 上的软件安装主要有四种方式: 在线安装 从磁盘安装deb软件包 从二进制软件包安装 从源代码编译安装 这几种安装方式各有优劣,而大多数软件包会采用多种方式发布软件,所以我们常常需要全 ...