C++Primer快速浏览笔记-复合类型

C++Primer2.3节介绍了两种复合类型:引用和指针

1.引用

  • 引用并非对象,它只是为一个已经存在的对象所起的别名。
  • 一旦初始化完成,引用将和它的初始值对象一直绑定在一起,不能重新绑定到另一个对象,因此引用必须初始化。
  • 定义引用时,程序把引用和它的初始值绑定到一起,而不是将初始值拷贝给引用。
  • 引用本身不是一个对象,所以不能定义引用的引用
  • 引用只能绑定在对象上,而不能与字面值或者某个表达式的结果绑定在一起。
  • 引用的类型必须和与之绑定的对象的类型严格匹配。但是有两种例外情况:

1.初始化常量引用时允许用字面值或任意表达式作为初始值,只要该表达式的结果能通过类型转换成引用的类型即可。
2.可以将基类的引用绑定到派生类对象上。

举几个例子:
int &refVal4 = 10; // 错误:引用类型的初始值必须是一个对象
double dval = 3.14;
int &refVal5 = dval; // 错误:此处引用类型的初始值必须是int型对象
int i = 42;
const int &r1 = i; // 允许将const int&绑定到一个普通int对象
const int &r2 = 42; // 正确:r2是一个常量引用
const int &r3 = r1 * 2; // 正确:r3是一个常量引用
int &r4 = r * 2; // 错误:r4是一个普通的非常量引用


2.指针

指针也能实现对其他对象的间接访问。与引用不同的是。

  • 指针本身就是一个对象,允许对指针赋值和拷贝,在其生命周期内可以先后指向几个不同的对象。
  • 指针无须在定义时赋初值。
    获取对象的地址
    指针存放某个对象的地址,使用取地址符获取地址:
    int ival = 42;
    int *p = &ival;
    指针值
    指针的值(即地址)应属下列4种状态之一:
  1. 指向一个对象。
  2. 指向紧邻对象所占空间的下一个位置。
  3. 空指针,未指向任何对象。
  4. 无效指针。
    利用指针访问对象
    如果指针指向了一个对象(需要是有效指针),则可以使用解引用符*来访问该对象。可以对其进行赋值等操作。
    空指针
    空指针不指向任何对象,在试图使用一个指针前代码可以首先检查它是否为空。生成空指针的方法:
  • int *p1 = nullptr; // 等价于int *p1 = 0;

    c++11新标准,建议使用

  • int *p2 = 0; // 直接p2初始化为字面常量0
  • // 首先#include cstdlib
    int *p3 = NULL; // 等价于 int *p3 = 0;
    直接把值为0的int 变量赋给指针是错误的操作
    int zero = 0;
    pi = zero; // _error: cannot assign an int to a pointer_

来自为知笔记(Wiz)

时间: 2024-12-15 06:54:12

C++Primer快速浏览笔记-复合类型的相关文章

C++Primer快速浏览笔记-类型转换

1.类型转换 bool b = 42; // _b is true_ int i = b; // _i has value 1_ i = 3.14; // _i has value 3_ double pi = i; // _pi has value 3.0_ unsigned char c = -1; // _assuming 8-bit chars_, _c has value 255_ signed char c2 = 256; // _assuming 8-bit chars_, _th

C++Primer快速浏览笔记

1.类型转换 bool b = 42; // _b is true_ int i = b; // _i has value 1_ i = 3.14; // _i has value 3_ double pi = i; // _pi has value 3.0_ unsigned char c = -1; // _assuming 8-bit chars_, _c has value 255_ signed char c2 = 256; // _assuming 8-bit chars_, _th

c++学习笔记--复合类型,const。

复习c++,有必要对一些东西做一下笔记,方便以后学习,如有问题,欢迎提出. 首先,最常用两种复合类型应该是引用和指针. 所谓复合类型,是在基本类型基础(如:int)上定义的类型. 引用是c++的一个复合类型,首先,它和指针不同的是它并不是一个对象,仅仅只是另一个对象的别名.而且,引用绑定的东西必须是一个对象,引用不是,所以定义引用的引用是 不合法的.也不能定义字面量的引用.同时,普通引用的绑定对象与引用定义类型必须相同. 如: int &a=10;//错误的,必能定义字面量 double b =

[C++ Primer Plus] 4、复合类型(一)程序清单

程序清单4.1 1 #include<iostream> 2 using namespace std; 3 4 void main(){ 5 int yams[3]; 6 yams[0]=7; 7 yams[1]=8; 8 yams[2]=6; 9 int yams_cost[3]={20,30,5}; 10 11 cout<<"Total yams="<<yams[0]+yams[1]+yams[2]<<endl; 12 cout<

[C++ Primer Plus] 5、复合类型(二)课后习题

1.编写一个 c++ 程序,如下述输出示例所示的那样请求并显示信息 : What is your first name? Betty SueWhat is your last name? YeweWhat letter grade do you deserve? BWhat is your age? 22Name : Yewe, Betty SueGrade : CAge: 22 1 #include<iostream> 2 using namespace std; 3 4 void main

《c++primer笔记》复合类型--引用

复合类型:基于其他类型定义的语言 这里介绍两种 引用 指针 声明语句:一个基本数据类型,一个声明符列表组成 引用:为对象起另外一个名字 引用类型:引用另外一种类型 int ival = 1024; int &refVal = ival;        //refVal指向ival(是ival的另一个名字) int &refVal2;              //报错,引用必须被初始化 一般初始化变量:初始值会被拷贝到新建的对象中 定义引用:把引用和他的初始值绑定在一起,而不是拷贝给引用.

C++ Primer Plus(四)——复合类型

只能在定义数组时才能初始化,不能将一个数组赋值给另一个数组,但可以使用下标分别赋值给数组元素,但可以将一个string对象赋值给另一个string对象 如果只对数组的一部分初始化,其他元素自动设置为0 C++11可在初始化的大括号里不包含任何东西,这将把所有元素设置为0 C++11在数组列表初始化时,禁止缩窄转换 C-风格字符串以\0结尾,不是\0结尾的字符数组不是字符串 任何两个由空白(空格,制表符,换行符)分隔的字符串常量都将自己拼成一个 sizeof运算符指出整个数组的长度,而strlen

C++ Primer Plus 复合类型

复合类型是指基于基本整型和浮点类类型而创建的数据格式. 1. 数组 1.1 声明数组时,必须指定元素数目,且元素数目必须是编译时已知的,所以变量(运行时设置的)不可以用来指定数目: 1.2 如果只对数组的一部分进行初始化,则编译器将其他元素设置为0; 所以初始化整个数组为0可以--int array[10] = {0}; 注: C++ 11支持去掉代码中的等号以及0,且不支持缩窄转换; 2. 字符串(C-风格字符串) 2.1 C++处理字符串有两种方式--C-风格字符串 & string类库;

Go语言学习笔记(4)复合类型

  Go语言的复合类型,包括数组.切片和映射等. 值.指针和引用类型 通常情况下Go语言中的变量持有相应的值.也就是说,我们可以将一个变量想象成它所持有的值来使用.其中有些例外,通道.函数.方法.映射.切片是 引用变量,它们持有的都是引用,也即保存指针的变量.值在传递给函数或者方法的时候会被复制一次,对于布尔类型和数值类型来说这非常廉价,但是对于大型变 量代价却非常大.而且复制传参的方式,修改值只是修改了副本,这能保证原始变量不被修改,但也一定程度上增加了修改原始值的麻烦.幸好在Go语言中有指