C++Primer学习笔记《2》

数组是一种复合类型,由类型名+数组名+维度组成。数组定义中的类型可以是C++基本内置类型,也可以是类类型的。数组元素的类型可以是除了引用类型以外的其他任何类型,没有所有的元素都是引用的数组。

数组的维度必须是大于或等于1的编译器常量,所谓的编译器常量就是指在编译期间就可算出结果的表达式,字面值常量,枚举类型,用常量表达式初始化的const对象。任何在编译器无法计算出的值都不可作为数组的维度值。

不管数组在哪里定义,如果其元素是类类型的,则自动调用类的默认构造函数进行初始化,如果该类没有默认的构造函数,那就必须显式的初始化所有元素。

字符串字面值的结尾处有一个null(‘\0’)来标识字符串的结束,很多C风格的库函数都是工作原理都是靠这个null来工作的,比如字符串的比较,赋值,连接等。

字符串字面值的数据类型是const char *类型。

可以使用字符串字面值来初始化字符数组。

Char ca1[] = {‘C’,‘+’,‘+’};

Char ca2[] = {‘C’,‘+’,‘+’,‘\0’};

Char ca3[] = “C++”;这三种定义方式都是合法的,对三个变量sizeof操作,sizeof在C++中是一个操作符,不是函数,虽然有一个括号。

Sizeof(ca1)= 3; sizeof(ca2) = 4; sizeof(ca3) = 4;

Ca3是一个很特殊的情况,因为字符串字面值初始化缺省默认维度的字符数组时后面会自动补null。Char ca4[3] = “C++”;就不对。

对ca2,ca3进行strlen求字符串长度操作,得到的结果均为3,因为strlen的工作原理就是从给定字符串的起始位置计数,直到在后面遇到一个null为止。对于ca1是一个例外了,因为ca1作为字符串时,其结尾没有null,所以strlen求不出预期的值。

数组不允许被复制和赋值。在vector中vector::size_type为其下标类型,在数组中size_t为其下标类型。如果类的成员为数组类型,在合成的复制或赋值成员中,编译器是把数组复制(赋值)了。

在C和C++中,在语言设计之处为了最求效率,不对数组的下标进行检测。有些编译器可能会做了扩展,对其检测,但这是不利于跨编译器移植的。比如array[-1],编译器可能不会抛错。

&符号的正确读法:取地址。其只能作用于左值身上(因为右值引用不清楚语法,在此抛开右值引用情况)。

*在作为指针方面用法的正确读法:解引用,当然它还有乘号的用法。

声明指针的两种风格,int
 *pi; int*  pi;这两种风格各有优劣,关键在坚持使用其中的一种。后一种容易出现的错误是:int* pi,i2;在这一句代码里,pi是一个指针,而i2则是一个整型变量,在这一点上第一种写法更靠谱。

C++在编译期无法得知指针是否被初始化,以及指针所指向的区域是否是和预期的一致。好的实践是不要尽早的定义指针变量,定义之处就初始化为0,编译期可以检测出0值的指针是并未指向任何对象的。

0值,或是编译期可获得值为0的const量都可以用来初始化指针。除了这两个外,也可以使用从C语言中继承下来的NULL宏定义,在编译期会自动替换成0值。当然还有一个对象的地址更是可以。

Int zero = 0; const int czero = 0;

int *pi = zero;是错误的;

int *pi2 = czero;倒是正确的。

指针只能初始化或赋值为同类型的变量地址或另一个指针(在这里接受的是地址范畴,和上一个条款不冲突)。但有两个例外:

void*指针可以接受任何其他类型的变量地址,只是其允许在函数传参和返回,以及指针的赋值和比较上,不允许使用void*指针来操作其所指向的对象。还有就是在类的继承体系内,父类的指针可以接受子类的对象地址。

引用和指针的区别

1:引用定义之处就要初始化,且引用关系一直存在。

2:给引用赋值修改的是引用所关联对象的值,指针确实在修改指针的指向了。

C++Primer学习笔记《2》

时间: 2024-11-09 06:47:39

C++Primer学习笔记《2》的相关文章

C++Primer学习笔记《三》

数组名其实就是一个常指针,指向数组元素中第一个的地址,在程序中如果要用指针遍历数组,不能直接用数组名来自增或自减,因为它是常量,一般先把数组名保存一份同类型的指针,然后再用这个指针来自增或是自减来实现遍历. 指针也是可以进行算术加法和减法的,但必须保证原地址和结果地址都是想同一个数组的元素或是指向数组的末端元素的下一个单元(类似end()). 指针的减法操作是有意义的,它表示两个指针的相对位置关系,减法结果是ptrdiff_t类型,和size_t类型一样,是一种机器相关的类型,size_t是无符

C++ Primer学习笔记(三) C++中函数是一种类型!!!

C++中函数是一种类型!C++中函数是一种类型!C++中函数是一种类型! 函数名就是变量!函数名就是变量!函数名就是变量! 重要的事情要说三遍... 接 C++ Primer学习笔记(二) 类的构造函数 与类同名,且无返回类型. 同类的成员函数一样,也可以在类中声明,在类外定义. 格式: 类名(): 成员1(成员1初始化值), 成员2(成员2初始化值) { } 以上,冒号至大括号中间的部分,称为构造函数的初始化列表,用于调用类成员的构造函数来初始化. 没有在初始化列表中显式指定初始化的成员,将会

C++ Primer学习笔记32_面向对象编程(3)--继承(三):多重继承、虚继承与虚基类

C++ Primer学习笔记32_面向对象编程(3)--继承(三):多重继承.虚继承与虚基类 一.多重继承 在C++语言中,一个派生类可以从一个基类派生,称为单继承:也可以从多个基类派生,称为多继承. 多重继承--一个派生类可以有多个基类 class <派生类名> : <继承方式1> <基类名1>,<继承方式2> <基类名2>,... { <派生类新定义成员> }; 可见,多继承与单继承的区别从定义格式上看,主要是多继承的基类多于一个

C++ Primer 学习笔记_35_面向对象编程(6)--虚函数与多态(三):虚函数表指针(vptr)及虚基类表指针(bptr)、C++对象模型

C++ Primer 学习笔记_35_面向对象编程(6)--虚函数与多态(三):虚函数表指针(vptr)及虚基类表指针(bptr).C++对象模型 一.虚函数表指针(vptr)及虚基类表指针(bptr) C++在布局以及存取时间上主要的额外负担是由virtual引起的,包括: virtual function机制:用以支持一个有效率的"执行期绑定": virtual base class:用以实现多次在继承体系中的基类,有一个单一而被共享的实体. 1.虚函数表指针 C++中,有两种数据

C++ Primer 学习笔记_98_特殊工具与技术 --优化内存分配

特殊工具与技术 --优化内存分配 引言: C++的内存分配是一种类型化操作:new为特定类型分配内存,并在新分配的内存中构造该类型的一个对象.new表达式自动运行合适的构造函数来初始化每个动态分配的类类型对象. new基于每个对象分配内存的事实可能会对某些类强加不可接受的运行时开销,这样的类可能需要使用用户级的类类型对象分配能够更快一些.这样的类使用的通用策略是,预先分配用于创建新对象的内存,需要时在预先分配的内存中构造每个新对象. 另外一些类希望按最小尺寸为自己的数据成员分配需要的内存.例如,

C++ Primer 学习笔记_73_面向对象编程 --再谈文本查询示例

面向对象编程 --再谈文本查询示例 引言: 扩展第10.6节的文本查询应用程序,使我们的系统可以支持更复杂的查询. 为了说明问题,将用下面的简单小说来运行查询: Alice Emma has long flowing red hair. Her Daddy says when the wind blows through her hair, it looks almost alive, like a fiery bird in flight. A beautiful fiery bird, he

C++ Primer 学习笔记_19_类与数据抽象(5)_初始化列表(const和引用成员)、拷贝构造函数

C++ Primer 学习笔记_19_类与数据抽象(5)_初始化列表(const和引用成员).拷贝构造函数  从概念上将,可以认为构造函数分为两个阶段执行: 1)初始化阶段: 2)普通的计算阶段.计算阶段由构造函数函数体中的所有语句组成. 一.构造函数初始化列表 推荐在构造函数初始化列表中进行初始化 1.对象成员及其初始化 <span style="font-size:14px;">#include <iostream> using namespace std;

C++ Primer 学习笔记_102_特殊工具与技术 --运行时类型识别[续]

特殊工具与技术 --运行时类型识别[续] 三.RTTI的使用 当比较两个派生类对象的时候,我们希望比较可能特定于派生类的数据成员.如果形参是基类引用,就只能比较基类中出现的成员,我们不能访问在派生类中但不在基类中出现的成员. 因此我们可以使用RTTI,在试图比较不同类型的对象时返回假(false). 我们将定义单个相等操作符.每个类定义一个虚函数 equal,该函数首先将操作数强制转换为正确的类型.如果转换成功,就进行真正的比较:如果转换失败,equal 操作就返回 false. 1.类层次 c

C++ Primer 学习笔记_99_特殊工具与技术 --优化内存分配[续1]

特殊工具与技术 --优化内存分配[续1] 三.operator new函数和operator delete 函数 – 分配但不初始化内存 首先,需要对new和delete表达式怎样工作有更多的理解.当使用new表达式 string *sp = new string("initialized"); 的时候,实际上发生三个步骤: 1)首先,表达式调用名为operator new 的标准库函数,分配足够大的原始的未类型化的内存,以保存指定类型的一个对象; 2)接下来,运行该类型的一个构造函数

C++ Primer 学习笔记_81_模板与泛型编程 --类模板成员[续1]

模板与泛型编程 --类模板成员[续1] 二.非类型形参的模板实参 template <int hi,int wid> class Screen { public: Screen():screen(hi * wid,'#'), cursor(hi * wid),height(hi),width(wid) {} //.. private: std::string screen; std::string::size_type cursor; std::string::size_type height