C++ Primer 读书笔记整理(一)

1.读取数量不定的输入数据时可以把cin语句放到条件判断语句中,如果流的状态有效则读取成功,否则读取失败。

例如:

while(cin>>value)
       /* do something */

2.顶层const与底层const的区别

1)顶层const表示任意的对象是const(即常量)

例如:

const int value = 0;  // i是顶层const常量
int i= 0;
int *const ptr = &i;  //ptr是顶层const常量

2)底层const一般用在引用和指针中,表示指针所指的对象或引用所绑定的对象是常量

例如:

const int ci = 42;    //顶层const
const int &ref = ci   //ref是底层const
const int *ptr = &ci; //ptr是底层const

3.常量表达式和constexpr

常量表达式是指其值不会改变并且在编译过程中就能得到计算结果的表达式。允许将变量声明为constexpr类型以便由编译器来验证变量

的值是否是一个常量表达式,如果不是将会报错。

在constexpr声明中如果定义了一个指针,限定符constexpr仅对指针有效,而对指针所指的对象无关。

例如:

const int *p = nullptr; //p是一个指向整型常量的指针
const int *q = nullptr; //q是一个指向整型的常量指针

要注意以上两者的区别。

4.const与类型别名

看以下代码:

typedef char *pstring;
const pstring cstr = 0; //cstr是指向char的常量指针
const pstring *ps;       //ps是一个指针,它的对象是指向char的常量指针

pstring本来是一个char型指针,但加上typedef后就表示一个类型,即char*类型,记住:const是对给定类型的修饰

 const pstring cstr = 0; 中的const修饰的是cstr,而 const pstring *ps; 中 的const修饰的是派生所指向的对象,ps本身不是常量,

如果为 const pstring * const ps; 则ps是一个常量指针,它指向的对象是指向char的常量指针,即ps为二重指针。

5.decltype

decltype(表达式) 中,如果表达式的内容是解引用操作,则decltype将得到引用类型,例如:

int i = 12,*p = &i;
//则decltype(*p)的结果类型是int&,而非int 

切记:1) decltype((表达式)) (双层括号)的结果永远是引用而 decltype(表达式) 结果只有当表达式本身是引用时才是引用。

2)decltype作用于数组(或函数名)时得到的类型是数组(或函数)而非指向数组(或函数)的指针。(这句话在C++Primer中出现不下5次)

6.getline函数

getline函数有成员版本和非成员版本,成员版本在标准库容器之中,这里介绍非成员版本。非成员版本形式为:

getline(输入流,string对象,指定分隔符) ,函数从一个给定的输入流中读取对象,存入string对象中,直到遇到指定的分隔符为止,指定

的分隔符一般为换行符。

7.范围for语句

形式为:

for(declaration:expression)
    {/* do something */}

其中expression部分是一个可迭代对象,declaration部分负责定义一个变量用于逐个访问可迭代对象中的每个元素,每次迭代,declaration部分

的变量都会被初始化为expression部分的下一个元素,例如:

vector<int> vec = {1,2,3,4};
for(int i:vec)
    std::cout<<i<<‘ ‘;
/* 将输出1 2 3 4 */

范围for语句的定义来源于与之等价的传统for语句:

for(auto beg = v.begin(),end = v.end();beg!=end;++beg)
      { /* do something */}

注意:1)不能通过范围for语句增加vector或其他容器的元素。因为在范围for语句中预存了end()的值,一单在序列中添加元素,end函数的值可能就变得无效了。

2)范围for语句也可以用来遍历数组中的元素。

未完待续...

时间: 2024-10-23 01:22:32

C++ Primer 读书笔记整理(一)的相关文章

C++ Primer读书笔记整理(二)

8.数组 标准库begin和end函数可作用于数组,分别用于获取指向数组首元素和尾元素下一位置的指针. 例如: int ia[] = {0, 1, 2, 3, 4}; int *beg = begin(ia); //beg指向数组首元素 int *e = end(ia); //e指向数组尾元素下一位置 begin和end函数定义在头文件iterator中. 另外:可以使用数组来初始化vector的对象: int arr[] = {0, 1, 2, 3, 4, 5}; vector<int> i

C++primer读书笔记11-多态

多态也是C++中的一个重要的方面,多态和动态类型,虚函数本质上是指相同的事情. 1 虚函数 类中的成员函数原型前面加上virtual 表面这个函数是个虚函数.虚函数的目的是为了在继承它的派生类中重新定义这个函数,以便于通过基类的指针或引用在运行时对派生类的函数进行调用. 2 派生类和虚函数 派生类一般情况下要重定义所继承的虚函数,有几个注意事项. <1>虚函数的声明必须和基类中的函数声明原型完全一致,例外的是当基类返回基类型的指针或者引用的时候,派生类可以派生类类型的指针或者引用 <2&

C++中的volatile(Primer读书笔记)

时间:2014.05.24 地点:基地 -------------------------------------------------------------------------- 一.简述 volatile限定符平时很少用到,今天倒是碰到了,所幸探个明白.volatile 英文字面意思是"不稳定的",确切的计算机含义时与机器相关,所以在对包含volatile的程序在移植到新机器或使用不同的编译器时往往还需要对编译器进行一些改变. -----------------------

C++ primer读书笔记10-继承

封装,继承,多态是C++的三大基本概念,这里着重总结一下继承相关的东西 1 类派生列表 类派生列表指定派生类要继承的基类,派生列表中有一个或者多个基类如: class B : public A1,protected A2,private A3 但是单继承时最常见的,多继承不多见 2 派生类的定义 派生类继承时,会包含父类的所有成员,即便私有成员不能被访问.父类中的虚函数,在派生类中一般也要定义,如 果不定义的话,派生类将继承基类的虚函数 3 基类必须是已经定义的 一个仅仅声明的类,是不能出现在派

C++primer读书笔记9转换与类类型

有时候指定了自己类类型来表示某种类型数据如SmallInt,那么为了方便计算就会指定一个转换操作符,将该类类型在某种情况下自动的转换为指定的类型 <1>转换操作符 operator type(); 转换函数必须是类成员函数,不能指定返回类型,并且形参列表必须为空,并且通常不应该改变转换对象,所以操作符通常定义为const成员. #include <iostream> using namespace std; class SmallInt { public: SmallInt(int

c++ primer读书笔记之c++11(二)

1 新的STL模板类型,std::initializer_list<T> c++11添加了initializer_list模板类型,用于提供参数是同类型情况的可变长度的参数传递机制,头文件是<initializer_list>. 其具体接口可参考cplusplus.com的介绍,地址如下:http://www.cplusplus.com/reference/initializer_list/initializer_list/?kw=initializer_list 与vector不

c++ primer读书笔记之c++11(四)

1  带有作用域的枚举 scoped-enumeration 相信大家都用过枚举量,都是不带有作用域的,在头文件中定义需要特别注意不要出现重名的情况.为了解决这种问题,c++11提供了带作用于的枚举.可以使用class EnumName定义,示例代码如下: enum {ZERO, ONE, TWO}; enum class color {RED, BLUE, GREEN}; 上面的是没有作用域的枚举定义形式,下面是带有作用域的枚举定义形式,调用带有作用域的枚举必须指定作用域,否则会编译出错. 还

c++ primer读书笔记之c++11(三)

1 =default构造函数限定符 c++11针对构造函数提供了=default限定符,可以用于显式指定编译器自动生成特定的构造函数.析构或赋值运算函数.参考代码如下: class CtorDftType { public: CtorDftType()=default; CtorDftType(const CtorDftType&)=default; CtorDftType & operator = (const CtorDftType &)=default; ~CtorDftTy

c++ primer读书笔记之c++11(一)

1 新的关键词nullptr c++11引入新的关键词nullptr,用于表示空指针,用于替换之前c提供的NULL(最初NULL是定义在stdlib中的宏定义,通常是0). 2 新的别名定义机制 alias declaration c++提供了使用typedef定义的别名机制,但是有时候很难理解.为了更好的使用别名机制,c++11提供了新的别名定义机制,类似代码如下: // alias declarations using VInt = int; // type alias using PInt