重拾C++

1、C++ = C(面向过程)  + C++(面向对象) + C++(泛型)

最新的C语言标准是C99。

输出流

#include <iostream>

using namespace std;

int main(void)

cout << "come up to learn c++"

endl与\n:endl确保程序继续运行前刷新输出。

2、不允许函数嵌套定义,using namespace std:cout。

int n_short; sizeof(int)    sizeof n_short

climits定义了符号常量表示类型的范围限制。   cout << ‘$’     cout.put(‘$’)打印字符

const常量在定义时就要初始化,比#define好:有明确类型、有作用域、可用于更复杂的类型。

不能将一个数组赋值给另一个数组。

cin一次读取一个单词,cin.getline丢弃换行符(缓冲区中擦除换行符),cin.get不丢弃换行符(缓冲区中会有换行符),cin及cin.get读取失败后设置失效位,可通过cin.fail、cin来判断失效,cin.clear清除失效位。

3、string可以赋值。string.size

定义结构体变量时可以省略关键字struct,结构体作为参数或整体赋值。结构体可以使用位段,匿名共用体。

枚举enum

int *pint = new int ;   delete pint;       int ps[]  = new int[10];  delete[] ps;  int *p1,p2;   p2是int型变量 

for(double x : prices) 用于迭代        

4、内联函数使用相应的函数代码替换函数调用,程序无需跳到另一个位置处执行代码再跳回来,内联函数的运行速度比常规函数稍快,代价是占用更多内存,如果程序在10个不同地方调用同一个内联函数将包含该内联函数的10个副本。经常调用的函数定义为内联(最终是否为内联取决于编译器或系统)。

内联函数在定义和声明处都要用inline。

5、引用是变量的别名,引用和指针的区别:

(1)当引用被创建时,它必须被初始化。而指针则可以在任何时候被初始化。

(2)一旦一个引用被初始化为指向一个对象,它就不能被改变为对另一个对象的引用。而指针则可以在任何时候指向另一个对象。

(3)不可能有NULL引用。必须确保引用是和一块合法的存储单元关联。

如果实参和引用参数不匹配,C++将生成临时变量。

尽量将形参声明为const类型:避免无意中修改参数、能够同时接受const和非const参数、能使函数正确生成并使用临时变量。

C++ 11新增了右值引用&&。

返回一个作为参数传递给函数的应用。

函数返回值可用const修饰。

setf(ios_base::fixed)  ios_base::fmtflags

6、默认参数必须要有函数原型(声明),在声明中要有默认值指定。对于带参数列表的函数,必须从右向左添加默认值。函数定义时不需添加默认值。

函数重载:参数类型或个数不同视为重载。匹配函数时并不区分参数的const和非const。

函数模板:

#include <iostream>
#include <cmath>
using namespace std;
template <typename T>
void Swap(T &a,T &b);

int main()
{
    int i = 10, j = 20;
    Swap(i,j);
    cout << i << '\t' << j << endl;
    return 0;
}

template <typename T>
void Swap(T &a,T &b)
{
    T temp;
    temp = a;
    a = b;
    b = temp;
}

函数模板不能缩短可执行程序,最终仍由两个独立的函数定义,最终的代码不包含任何模板。

模板可以重载,模板的参数不一定是模板参数。

模板的局限性:模板可能无法处理某些类型操作,如结构体比较、数组赋值。

显示具体化:

编译器使用模板为特定类型生成函数定义时得到的是模板实例。调用时自动生成具体函数定义称为隐式实例化。

还可以显示实例化:

显示具体化还需要自己定义函数实现,显示实例化是不需要的。

7、名称空间

头文件中包含的内容:

自动存储特性、静态存储特性(static)、线程存储特性(thread_local)、动态存储特性(new)

外部链接特性、静态存储特性

c-v限定符、mutable

namespace{

.....

}

名称控件是全局的,可以位于另一个名称空间中,但不能位于代码块中。

对名称空间的使用:

using xxxx::yy;using编译指定                      using namespace xxx; using声明

8、C++默认访问控制为private

默认构造函数

#include <iostream>
#include <cmath>
using namespace std;

class Stock{
private:
    int age;
    string name;
public:
    Stock(int i_age,string s_name);
    ~Stock(){};
    int getage();
};

Stock::Stock(int i_age,string s_name)
{
    age = i_age;
    name = s_name;
}

int Stock::getage()
{
    return age;
}

int main()
{
    Stock stock = Stock(12,"chenkaing");
    cout << stock.getage() << endl;
    return 0;
}

9、运算符重载必须是有效的C++运算符,重载的运算符不必是成员函数,但必须至少有一个操作数是用户自定义的类型,不能违反原来的句法规则,不能创建新运算符,不能重载的运算符:

只能通过成员函数进行重载的运算符:

10、友元

友元函数:重载二元运算符*,必须是自定义的类在左边作为调用函数,右边是double,不能反过来,可以用友元函数解决这个问题。

用friend关键字。

友元类:friend class xxx;

友元成员函数:

类前向声明

只有一个参数的构造函数才能作为自动转换函数,可用explicit可以关闭这种特性。隐式转换的几种情况:

将自定义的类转换为基本类型,要用到转换函数:

11、C++自动定义了下面这些成员函数:

隐式地址运算返回调用对象的地址。

复制构造函数用于将一个对象复制到新创建的对象中,用于初始化过程中,而不是常规赋值中。默认复制构造函数逐个复制非静态成员的值,如果类的成员本身就是对象,则调用这个对象的复制构造函数复制自己。

如果类中使用 了new初始化的指针成员,应当定义一个复制构造函数以复制指向的数据而不是复制指针。

初始化总是会调用复制构造函数,而使用=运算符可能会调用赋值运算符。隐式赋值运算符与复制构造函数的问题一样面临浅拷贝问题,解决方法是提供赋值运算符定义。其实现与复制构造函数类似,也有一些差别:

定位new运算符

12、成员初始化列表

13、虚函数

实现多态公有继承的两种重要机制:在派生类中重新定义基类的方法,使用虚方法。

使用虚析构函数,保证正确的析构函数序列被调用。

向上转型允许,向下转型默认不允许。

可以返回类型协变。

纯虚函数 =0,抽象基类。

14、继承与动态内存分配

如果基类使用了动态内存分配,并重新定义赋值和复制构造函数,则:

如果派生类不用new,则不用重新定义复制和赋值构造函数;如果派生类用了new,必须显示定义析构函数、复制构造函数和赋值运算符。

派生类访问基类的友元。

15、初始化顺序

使用using重新定义访问权限。

16、多重继承

多重继承会导致基类的多个副本问题,虚基类解决这个问题。在类继承中用vritual声明继承。

C++在基类是虚的时禁止信息通过中间类自动传递给基类。要显示调用所需的基类构造函数。

MI处理比较麻烦。

17、模板类

template <typename type>

类模板与函数模板很相似,有隐式实例化、显示实例化和显示具体化。

C++还允许部分具体化:

成员模板。。。

18、嵌套类

19、异常

try...catch....

栈解退

exception类

20、RTTI 运行时类型识别

只能将RTTI用于包含了虚函数的类层次结构。

dynamic_cast<Type*>pt

typeid返回一个type_info对象的引用。

21、类型转换运算符

dynamic_cast:向上转换安全判断

const_cast、static_cast、reinterpret_cast

22、string类

23、智能指针模板类

auto_ptr:自动释放申请的内存

24、匿名函数lambda、包装器

25、输入输出

iostream自动创建8个流对象:

刷新缓冲区用endl或flush。

ios_base类存储了描述格式状态的信息。hex、width、fill、precision、setf、ios::showpoint。使用控制符比setf要更友好。

cin或cout包含一个描述流状态的数据成员,由3个ios_base元素组成:eofbit、badbit和failbit。clear和setstate。

读取输入时希望跳过空白则用>>。

打开多个文件,定义一个流,使用完后依次关联到多个文件。

 

+ Effective C++

1、C++ = C + 面向对象 + 泛型 + STL

2、尽量用const、enum、inline替换#define。#define不能定义class专属常量,也不能提供任何封装性。

3、确定对象使用前被初始化

4、如果自己没声明,编译器默认为类添加一个copy构造函数、一个copy assignment操作、一个构造函数和析构函数,所有这些函数都是public和inline的。

5、为多态基类声明virtual析构函数。

6、析构函数不要抛出异常

7、不在构造和析构函数中调用virtual函数,base class构造期间,virtual函数不会下降到derived class。

8、令operator=返回一个返回一个  reference to *this

在operator=中处理自我赋值。

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值