C++自学笔记_几种操作符_《C++ Primer》

1. 箭头操作符

  C++为包含点引用操作符和解引用操作符的表达式提供了一个同义词:箭头操作符(->)。

  点操作符用于获取类类型对象的成员:

item.same_isbn(item2);   //item是个类类型对象,same_isbn(Sales_item item)是该对象定义的方法

  假如现在有指向Sales_item对象的指针或者迭代器,则在使用点操作符前,需要先对改指针或者迭代器进行解引用:

Sales_item *sp=&item1;
(*sp).same_isbn(item2); //注意要用括号括起来,因为解引用操作符的优先级低于点操作符

  上述代码没有问题,但是容易出错,所以C++定义的箭头操作符。

  上述代码可以直接这么写:

Sales_item *sp=&item1;
sp->same_isbn(item2);

  放道习题:

  假设iter为 vector<string>::iterator 类型的变量,指出下面哪些表达式是合适的?并解释这些合法表达式的行为。

  (a) *iter++;          (b) (*iter)++;          (c) *iter.empty();

  (d) iter->empty();       (e) ++*iter;           (f) iter++->empty();

  解答:

  (a)是合法的,后自增操作符的优先级要高于解引用操作符,但是要注意的是如果有返回的值,返回的对象是迭代器增加前指向的对象而不是增加后指向的对象,虽然后自增先执行。

  (c)是非法的,点操作符的优先级高于解引用操作符(点操作符的优先级很高啊...)

  (d)是合法的,这就是上面所说的内容,意思是调用iter所指向的对象的empty()方法。

  (e)是非法的,前自增操作符的优先级等于解引用,所以遵循从左至右的顺序,所以如果是*++iter就对了。

  (f)是合法的,先执行和(d)一样的操作,完了以后iter加1。

2. 条件操作符

  条件操作符是C++中唯一的三元操作符。这里就说明它的一个用途:使用嵌套的条件操作符求出三个变量的最大值,并将最大值赋值给max.

int main(){
    int a=7,b=9,c=8;
    int max=a>b?a>c?a:c:b>c?b:c;
    cout<<max<<endl;
    return 0;
}

3. sizeof操作符

  sizeof操作符的作用是返回一个对象或类型名的长度,单位是字节

  ·对char类型或者值为char类型的表达式做sizeof操作保证得1。

  ·对引用类型做sizeof操作将返回存放此引用类型对象所需的内存空间大小。

  ·对指针做sizeof操作将返回存放指针所需要的内存大小;注意:如果要获取该指针所指向的对象的大小,则必须对该指针进行解引用。

  ·对数组做sizeof操作等效于将对其元素类型做sizeof操作的结果乘上数组元素的个数。因为sizeof返回整个数组在内存的存储长度,所以用sizeof数组的结果除以sizeof其元素类型的结果,即可求出数组元素的个数。

int x[10];
int *p=x;
cout<<sizeof(x)/sizeof(*x)<<endl;    //10
cout<<sizeof(p)/sizeof(*p)<<endl;    //1

  关于对类对象调用sizeof操作符。

Sales_item item;
int a=sizeof(item);
cout<<a<<endl;      //a=16

完了。

时间: 2024-10-06 20:56:39

C++自学笔记_几种操作符_《C++ Primer》的相关文章

C++ Primer笔记2_四种类型转换_异常机制

1.类型转换 命名的强制类型转换: 有static_cast.dynamic_cast.const_cast.reinterpret_cast static_cast: 编译器隐式执行的任何类型转换都可以由static_cast完成 当一个较大的算术类型赋值给较小的类型时,可以用static_cast进行强制转换. 可以将void*指针转换为某一类型的指针 可以将基类指针强制转换为派生类指针,但是不安全. 无法将const转化为nonconst,这个只有const_cast才可以办得到 举例:

C++自学笔记_string测试编程题_《C++ Primer》

今天<C++ Primer>学完第9章,关于string类型,找道题目测试一下效果. 题目描述: 输入一个字符串,以回车结束(字符串长度<=100).该字符串由若干个单词组成,单词之间用一个空格隔开,所有单词区分大小写.现需要将其中的某个单词替换成另一个单词,并输出替换之后的字符串. 输入: 多组数据.每组数据输入包括3行, 第1行是包含多个单词的字符串 s, 第2行是待替换的单词a,(长度<=100) 第3行是a将被替换的单词b.(长度<=100) s, a, b 最前面和

C++ Primer笔记12_运算符重载_递增递减运算符_成员访问运算符

1.递增递减运算符 C++语言并不要求递增递减运算符必须是类的成员.但是因为他们改变的正好是所操作对象的状态,所以建议设定为成员函数. 对于递增与递减运算符来说,有前置与后置两个版本,因此,我们应该为类定义两个版本的递增与递减运算符. 问题来了,程序是如何区分前置和后置呢?因为都是++和-- 为了解决这个问题,后置版本的递增递减运算符接受一个额外的(不被使用)int类型的形参.当我们使用后置运算符时,编译器为这个形参提供一个值为0的实参.这个形参唯一的作用就是区分前置和后置运算符函数. 因为不会

Asp.Net Identity学习笔记+MVC5默认项目解析_授权&Claim

Identity学习笔记 Asp.Net Identity学习笔记+MVC5默认项目解析_基础用法 Asp.Net Identity学习笔记+MVC5默认项目解析_授权&Claim Identity学习笔记授权以角色授权IdentityRoleRoleManager基于声明的(Claims)IPrincipalIIdentityCalimsIdentityClaim用户登入用户授权其他细节Claim Type命名空间 授权 最常用的授权就是给Controller或Action打上[Authori

Asp.Net Identity学习笔记+MVC5默认项目解析_第三方登入&授权总结

Identity学习笔记 Asp.Net Identity学习笔记+MVC5默认项目解析_基础用法 Asp.Net Identity学习笔记+MVC5默认项目解析_授权&Claim Asp.Net Identity学习笔记+MVC5默认项目解析_第三方登入&授权总结 Identity学习笔记第三方登入配置登入案例登入技术总结本地,已登入本地,未登入第三方登入 第三方登入 本文介绍Identity的第三方登入技术.到目前为止只介绍了CookieAuthentication这种授权方式,即浏览

ZZUOJ 1199 大小关系(拓扑排序,两种方法_判断入度和dfs回路判断)

1 /* 2 这道题如果按照度为0的节点来判断的时候,将度为0的节点和其相连的节点(度数并减去1) 3 从图中去掉,如果度为0的节点的个数为0个但是图中的节点没有都去掉的 时候那么说明 4 出现了回路!用这种方法必须将重边去除掉! 5 6 所以推荐用dfs方式进行判断!这种方式还是比较直观的! 7 */ 8 #include<iostream> 9 #include<cstring> 10 #include<cstdio> 11 #include<algorith

Flume环境搭建_五种案例

Flume环境搭建_五种案例 http://flume.apache.org/FlumeUserGuide.html A simple example Here, we give an example configuration file, describing a single-node Flume deployment. This configuration lets a user generate events and subsequently logs them to the conso

[terry笔记]ogg_迁移同步实验_零停机

oracle golden gate我最近正在琢磨,这个软件我觉得约等于dataguard的逻辑模式,我认为其最大的优势是更可控制,比如可以细化到某个schema.某个table的同步. 如下实验的主要步骤: ogg根据scn同步数据,源库零停机时间 1. 配置好ogg源端的mgr.抓取和传送进程,并启动. 2. 配置好ogg目标端的mgr.复制进程,仅启动mgr. 3. 源端可自由进行交易,此时观察源与目标的trail文件是否都正常. 4. 查询源端此时的scn,并按照参数flashbask_

C++_系列自学课程_第_10_课_表达式_《C++ Primer 第四版》

程序设计语言中大部分程序都在进行表达式的求值操作, 例如求两个数的和,求一个表达式的逻辑结果,或者通过输入输出表达式语句进行输入和输出. 这里我们对表达式进行讨论. 一.表达式 1.表达式 表达式由一个操作数或者多个操作数同操作符组合而成: 字面值是一个最简单的表达式.  表达式都会产生一个结果,如果表达式中没有操作符,则表达式 的值是操作数本身, 如果表达式中有操作符,则表达式的结果是操作符对操作数进行操作后的结果. 一般而言表达式的返回的是右值,不能给表达式赋值, 但可以获取表达式的值. E