1.数组引用形参,C++允许将变量定义成数组的引用,给予同样的道理,形参也可以是数组的引用,此时引用形参绑定到对应的实参上,也就是绑定到数组上

 void print(int (&arr)[])
{
for (auto elem : arr)
cout << elem << endl;
}

包含有可变形参 的函数,C++11提供了两种主要的方法:如果所有的实参类型相同,可以传递一个名为initializer_list的标准库类型;如果实参的类型不同,可以编写一种特殊的函数,也就是所谓的可变参数模板。initializer_list是一种标准库类型,用于表示某种特定类型的数组,这种类型定义在同名的头文件中,和vector一样,它也是一种模板类型,定义对象时,必须说明列表中所含元素的类型,和vector不一样的是,initializer_li9st对戏那个中的元素永远是常量值,无法改变对象中元素的值。

 void err_msg(initializer_list<string> il)
{
for (auto beg = il.begin(); beg != il.end(); ++beg)
cout << *beg << " ";
cout << endl;
}

如果想向initializer_list形参中传递一个值得序列,则必须把序列放在一对花括号内;

 if (expected != actual)
error_msg({"functionX"", expected, actual});
else
error_msg({"functionX", "okay"});

而另一种方法是省略符形参,她是为了便于C++程序访问某些特殊的C代码而设置的,这些代码使用了名为varargs的C标准库功能。通常,省略符形参不应用于其他目的。

2.函数可以返回花括号保卫的值得列表,类似于其他返回结果,此处的列表页用来对表示函数返回的临时两进行初始化,如果列表为空,临时两知性初始化;否则,返回的值有函数的返回类型确定,在下面例子中,返回一个vector队形,用他存放信息。

 vector<string> process()
{ if (expected.empty))
return {};
else if (expencted == actual)
return {"functionX", "OK"};
else
return {"functionX", expected, actual};
}
 int arr[];
int *p1[];
int (*p2)[] = &arr; //p2是一个指针, 它指向含有10个整数的数组

3.assert预处理宏,其实是一个预处理变量,他的行为类似于内联函数,assert宏使用一个表达式作为他的条件:assert(expr);。首先对expr求职,如果表达式为假,那么assert输出信息并中止程序的知性,如果为真,那么assert什么也不做。assert用于检查“不能发生”的条件

 assert(word.size() > threshold);

。当不需要assert在运行中起作用时候,通过定义NDEBUG的预处理变量可以取消这个assert的作用,或者通过给编译器选项 /d 或者-d。其等价于在主文件中第一行写下#define NDEBUG

                                              ——10月20日

/*--------------------------------------------------------------------------------------------------------*/

这些天没有写博客,有些事耽搁了,今天回来继续写。

/*--------------------------------------------------------------------------------------------------------*/

4.类的基本思想是抽象和封装,数据抽象是一种依赖于接口和实现的分离的编程和设计技术。构造函数不能声明为const,当我们创建类的一个const对象时,直到构造函数完成初始化过程,对象才能真正取得其常量属性。因此,构造函数在const对象的构造过程中可以向其写值。在C++11中,允许通过写入 =default来制定默认的构造函数。

  构造函数初始值列表负责为新创建的对象的一个或几个数据成员赋值,不同成员的初始化通过都好分割开来

 Sales_data(const std::string &s):
bookNo(s), units_sold(), revenue()
{//构造函数初始值列表
}

作为接口的一部分,构造函数和部分成员函数被放在public中,而数据成员和作为实现部分的函数则包喊在private中。struct和class的唯一区别就是默认访问的权限不一样。struct默认poublic而类默认private。

  友元的作用是可以让其他函数或者类访问自己的私有成员,例如:写了一个辅助函数,这个函数不是类中的成员函数,但是它存在的意义是辅助这个类,可能要访问下类中的私有成员,但是没法访问,这时在类中定义friend 这个函数那么这个函数就能访问其私有长远了;同样,另一个类要访问这个类的私有成员也要在这个类里面写上“另一个”类的fried声明。

class Sales_data
{
friend Sales_data add(const Sales_data &, const Sales_data &);
friend std::istream &read(std::istream&, Sales_data&);
public:
......
private:
......
};
Sales_data add(const Sales_data&, const Sales_data&);
std::istream &read(std::istream&, Sales_data&);

友元不受类的访问权限限制,一般来说,最好在类的开始或者结束前的位置集中声明友元。把友元的声明放在类的定义文件中,类的外边。friend的声明旨在告诉类那些是友元函数,并没有真正的声明函数,所以要在类的外边重新不带friend声明函数。可以另一个类或者一个类中的某个方法称为这个类的友元。

class A
{
friend void B::hello();
friend class C;
public:
private:......
};

5.列表初始化和在构造函数内部写语句赋值。列表初始化时在初始化的时候对内部成员赋值,而在构造函数内写赋值是先初始化完成后再对其赋值,其效率是不同的。

默认实参的使用,当没有给定实参时候,如果有默认的实参,不提供实参也能初始化构造函数,所以该构造函数实际上为我们的类提供了默认的构造函数。

 class Sales_data
{
public:
Sales_data(std::string s = ""): bookNo(s) { }
Sales_data(std::string s, unsigned cnt, ouble rev):
bookNo(s), units_sold(cnt), revenue(rev*cnt) {}
Sales_data(std::istream &is) {read(is, *this); }
};

6.类的静态成员,有时类需要他的一些成员与类本身直接相关,而不是与类的各个对象保持关联。通过在成员的声明之前加上关键字static使得其与类关联在一起,和其他成员一样,静态成员可以是public的或者private的,静态数据成员的类型可以使常量、引用、指针、类类型等。

 class Account
{
public:
void calculate() { amount += amount * interestRate; }
static double rate() { return interestRate; }
static void rate(double );
pribate:
std::string owner;
double amount;
static double interestRate;
static double initRate();
};

不能再类的内部初始化静态成员,相反的必须在类的外部定义和初始化每个静态成员。如果在类内初始化,应该将其声明为const类型的。

《C++Primer》复习——with C++11 [2]的更多相关文章

  1. 《C++Primer》复习——with C++11 [4]

    考虑到STL的掌握主要靠的是练习,所以对于STL这部分,我把书中的练习都做一遍,加深印象.这些练习是第9.10.11.17章的,分别是顺序容器.泛型算法和关联容器等. ——10月22日 /*----- ...

  2. 《C++Primer》复习——with C++11 [1]

    1.头文件中不应包含using声明,因为头文件的内容会拷贝到所有引用到他的文件中去,如果头文件里有谋个using声明,那么每个使用了该头文件的文件就会有这个声明,由于不经意间包含了一些名字,反而可能产 ...

  3. 《C++Primer》复习——with C++11 [3]

    1.我们的程序经常使用很多IO库,用来输入输出例如:istream(输入流)类型,提供输入操作. ostream(输出流)类型, 提供输出操作. cin, 一个istream对象,从标准输入读取数据. ...

  4. c++primer复习(六)—面向对象编程

    1 C++中,通过基类的引用(或指针)调用虚函数时,发生动态绑定,两个条件(基类引用或指针.虚函数)缺一不可 虚函数的默认实参将发生静态绑定 2 继承层次的根类一般都需要定义虚析构函数 3 任意非st ...

  5. c++primer复习(一)

    1 const对象默认为文件的局部变量(P50) a.cpp ; b.cpp extern int a;//undefined reference to "a" a.cpp ; b ...

  6. 【C语言学习】《C Primer Plus》第11章 字符串和字符串函数

    学习总结 1.字符串(character String)是以空字符串(\o)结尾的char数组. 2.gets()方法代表get String,它从系统的标准输入设备(通常是键盘)获取一个字符串,当字 ...

  7. c++ primer复习(四)

    1 标准库容器 顺序容器:vector.list.deque 容器适配器:stack.queue.priority_queue 2 容器元素类型约束: 容器元素类型必须支持复制和赋值,因为容器存放的都 ...

  8. c++ primer复习(五):类

    一:基本内容 1 类 数据成员:用于存储与类对象相关联的状态 成员函数:对数据成员进行操作 类将接口与实现分离,接口指定了类支持的操作,操作的具体实现细节是类的设计者才需要了解 2 类成员 类成员可以 ...

  9. c++ primer复习(三)

    1 istream.ostream类型,cin.cout.cerr是istream或ostream类型的具体的对象,<<和>>是操纵符 getline函数的参数是istream ...

随机推荐

  1. java中的@Override是否需要

    java中的重载注解 @Override 是否需要?今天被人问到这个问题,回答的不太好,下来看了一下源码 /** * Annotation type used to mark methods that ...

  2. 坑到了,EF执行带事物的存储过程

    用EF开发项目,今天调用 带事物 存储过程,始终报错,"EXECUTE 后的事务计数指示 BEGIN 和 COMMIT 语句的数目不匹配.上一计数 = 1,当前计数 = 0.\r\nEXEC ...

  3. Android之聊天室设计与开发

    我们要设计和实现一个有聊天室功能的APP,需要服务器不断读取来自客户端的信息,并即时地将信息发送给每个连接到本服务器上的客户端,每个客户端可以向服务器发送消息,并不断地接收来自服务器的消息,并将消息显 ...

  4. Java类加载的时机_4种主动引用会触犯类加载+剩下的被动引用不会触发类的加载

    转载自:http://chenzhou123520.iteye.com/blog/1597597 Java虚拟机规范没有强制性约束在什么时候开始类加载过程,但是对于初始化阶段,虚拟机规范则严格规定了有 ...

  5. 在window 下安装Memcache详解

    有时候我们需要在本地测试的时候就用到memcahce,如果本地没有安装memcache,就会有下面的错误提示: 1234567 系统发生错误 您可以选择 [ 重试 ] [ 返回 ] 或者 [ 回到首页 ...

  6. [转]Mac OS X 下部分Android手机无法连接adb问题之解决方案

    时至当今,Android山寨手机厂商已如此之多,能修改和个性化定制Android OS的能人已是多如牛毛,有的牛人修改Android系统只会影响所修改的点,不会影响其它,然后还有的就不多说了,总之做的 ...

  7. Linux基本服务命令

    启动Httpd服务:service httpd start 停止Httpd服务:service httpd stop 重启Httpd服务:service httpd restart 关闭httpd所有 ...

  8. MySQL Limit order by

    今天写模糊查询的时候,按照时间排序并进行分页时,在mybatis的映射文件中有这样一条sql语句 SELECT <include refid="Base_Column_List&quo ...

  9. <hash命令:显示、添加或清除哈希表>

    linux系统下的hash指令: 说明:linux系统下会有一个hash表,当你刚开机时这个hash表为空,每当你执行过一条命令时,hash表会记录下这条命令的路径,就相当于缓存一样.第一次执行命令s ...

  10. IOS_问题: Xcode8 安装KSImageName插件, 编代码就崩了

    Xcode 8之后, KSImageName插件就不能用了,如果安装了,就会导致一写英文代码Xcode 就崩了. 解决方法: 把这个插件删除,重启了一下xcode就可以了, 如果重启没用, 可以尝试下 ...