第一周笔记
一C++编程简介
基于对象Object Based:对单一class的设计,
面向对象Obejct Oriented:面对的是多重classes的设计,classes和classes之间的关系
STL是Standard Template Library的简称(标准模板库)
Struct与class的区别?
最本质的区别就是默认的访问控制。struct作为数据结构的实现体,它默认的数据访问控制是public的,而class作为对象的实现体,它默认的成员变量访问控制是private的。
#include<cstdio>与#include<stdio.h>的区别??
加C头文件是C++为了兼容纯C语法而对.h文件进行了处理,例如cstdio
写.h文件时 通常会加上防卫式声明
在include一个文件时,若程序中include了当前程序中已经include了的文件,则不会有重复的include含入动作(最好任何头文件都要加防卫式的声明)
把t指定为double和int
(本体内定义的就是inline function)不在本体内定义的加inline
复杂的没法内联如何理解?
可消除所有与调用相关的痕迹以及性能的损失。inline通过消除调用开销来提升性能。
内联函数与宏函数的区别
(1)内联函数同宏函数一样将在被调用处进行代码展开,省去了参数压栈、栈帧开辟与回收,结果返回等,从而提高程序运行速度。
(2)内联函数相比宏函数来说,在代码展开时,会做安全检查或自动类型转换(同普通函数),而宏定义则不会。
inline函数的缺点总结如下:
(1)代码膨胀。
inline函数带来的运行效率是典型的以空间换时间的做法。内联是以代码膨胀(复制)为代价,消除函数调用带来的开销。如果执行函数体内代码的时间,相比于函数调用的开销较大,那么效率的收获会很少。另一方面,每一处内联函数的调用都要复制代码,将使程序的总代码量增大,消耗更多的内存空间。
(2)inline函数无法随着函数库升级而升级。
如果f是函数库中的一个inline函数,使用它的用户会将f函数实体编译到他们的程序中。一旦函数库实现者改变f,所有用到f的程序都必须重新编译。如果f是non-inline的,用户程序只需重新连接即可。如果函数库采用的是动态连接,那这一升级的f函数可以不知不觉的被程序使用。
(3)是否内联,程序员不可控。
inline函数只是对编译器的建议,是否对函数内联,决定权在于编译器。编译器认为调用某函数的开销相对该函数本身的开销而言微不足道或者不足以为之承担代码膨胀的后果则没必要内联该函数,若函数出现递归,有些编译器则不支持将其内联。
(比较推荐的写法是把一个经常要用的而且实现起来比较简单的小型函数放到类里去定义,大型函数最好还是放到类外定义。)
Public:
Private:一般哪些放入private(不打算被外界调用的)
(第三种?)protectd
外部如何得到private数据?
public中读取
设定读写!!!
构造函数:构造函数与类名相同;没有指明参数用默认值,没有返回类型(不需要)
用来创建对象
(相比起来效率低)
变量数值设定分两阶段:初始化,赋值(assign)
用动态方式创建,得到指针
析构函数??,不带指针的类多半不用析构函数
构造函数可以有很多歌重载overloading(常常发生在构造函数)
同名函数可以有多个
8uHG?
这里不行
因为这里调用complex的话1和2冲突
把构造函数放进private(有这种需求)
设计模式--singleton(单例)
设计接口指的是?
不加const的后果:
如果被调用处没有加const 使用时加了const
Reference(引用)最好所有参数都pass by reference而不是pass by value
希望传了引用而不能改内容时 加一个const
c++比其他面向对象效率要高,这部分也是讲提高效率
返回值的传递也尽量 by reference
什么情况不return by reference?
Friend打破了封装
通过函数拿数据效率比friend拿数据效率慢
编写class注意三点(以高效率为标准)
数据 一定放在private里面
参数尽可能pass by reference(加不加const看状况)
尽量renturn by reference
在类的本体里的函数,能加const的就加
构造函数 尽量用初值列
关于::
1)global scope(全局作用域符),用法(::name)
2)class scope(类作用域符),用法(class::name)
3)namespace scope(命名空间作用域符),用法(namespace::name)
c++语言中建议使用引用类型的形参代替指针?? 详见p190
操作符重载与临时对象 (下列代码,皆是class body外的)
操作符重载实质上是函数重载
(用reference的好处)
这里complex&接收,return *ths传出怎么理解??
按照c的特性,基本操作符可以做上图中从右到左的赋值
如果而这里设计成void ,c3+=c2+=c1不能通过
小结:当使用者连串使用重载运算符时应注意重载操作符函数的定义
返回的是临时对象,则不能return by reference
黄色部分创建的就是临时对象
设计函数时两种思想
设计成成员函数
设计成全局函数(前面没有类的名称)
如果使用时连串输出,则不能定义成void