cpp随笔1

简介

开始使用C++来写程序了,这次没时间看primer了,先直接用它上手做东西,分析C++反汇编的时候再过一下primer中的语法点。毕竟语言还是要用才能熟。中间遇到的一些问题作为随笔先记录着

后台服务采用java写,库多。所有底层操作与文件处理等都用C++写。所有系统的文件操作与系统管理都用脚本。

C++中的类

目前基本用法与java中区别不大,不过注意析构函数。析构函数中一定要有回收操作,不会有人自动帮你回收堆分配的东西的,除了手动free。
C++中通知对象构造失败的唯一方法那就是在构造函数中抛出异常,throw 对象。该对象可以是任意类型的。因此在构造函数可能出错时要确保回收任务,并及时中断构造。
不过java中说了..不要在构造函数里抛出异常。这是设计角度的问题,构造函数应该只是负责基本的赋值,再加个init负责初始化对象的功能,将错误等集中在析构函数中回退处理。外层检测初始化失败时及时delete。还不太清楚…看设计模式吧….

C++模板

模板定义:模板就是实现代码重用机制的一种工具,它可以实现类型参数化,即把类型定义为参数, 从而实现了真正的代码可重用性。模版可以分为两类,一个是函数模版,另外一个是类模版。

1
2
3
4
5
6
7
template <class 形参名,class 形参名,......> 返回类型 函数名(参数列表)
   { 函数体}
template<class 形参名,class 形参名,…> class 类名
    { ... };

就是可以传入一个代表类型的参数

函数重载是由定义方确保传入的参数类型可以执行操作。而模板是由调用方确保传入的参数可以执行操作,都是定义俩套操作。用那套操作是编译时决定的,因此对于我的动态时确定类型要加一个控制函数把俩种模板都调用一下
而手动的if判断是俩套操作合一,并运行时由代码判断使用哪个操作
结合auto与decltype。编译时自动判断变量类型与编译时自动判断类型声明。可以十分方便的进行代码压缩。
类型操作的自由度:手动if运行时>函数重载>模板
代码量:手动if>函数重载>模板
代码可读性:手动if>函数重载>模板
模板最好的使用时机就是俩个类的操作几乎完全一样,但是类型却不一样的情况。此外大量使用模板+auto代码真的难读….连自动提示都不能使用了…因此为了确保逻辑清晰代码好读写功能时还是用手动流程吧……..这样思路明确点。利于知识点,业务处理方面比较没营养的代码就多用模板什么的。此外看下设计模式

关于多态的实现

c++的静态多态编译时通过覆盖和模板实现,运行的方法看代码中指针的类型而定
运行时多态通过虚函数实现的,也就是运行的方法看对象而定

java

abstract-java
java中的抽象:只有抽象类才可以定义抽象方法,抽象方法不可以有实现,只能用于继承。抽象类不能生成对象,子类必须全部实现抽象方法,否则自己也要是抽象的。
java中抽象父类被赋予的一定是实现子类的对象,其函数调用也一定是子实现的方法。
java中普通的重载,子赋给父调用的是子(无论如何调用不了父的,只能对象内),父不可强转给子。

模板功能相同,也是编译时多重实现,相当于自动重载

c++

virtual

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include <iostream>
using namespace std;
class Father
{
public:
int m_fMember;
void testFunc(){
cout<<"Father testFunc "<<m_fMember<<endl;
}
virtual void testVFunc(){
cout<<"Father testVFunc "<<m_fMember<<endl;
}
Father(){m_fMember=1;}
};
class Child : public Father{
public:
int m_cMember;
Child(){m_cMember=2;}
virtual void testVFunc(){cout<<"Child testVFunc "<<m_cMember<<":"<<m_fMember<<endl;}
void testFunc(){cout<<"Child testFunc "<<m_cMember<<":"<<m_fMember<<endl;}
void testNFunc(){cout<<"Child testNFunc "<<m_cMember<<":"<<m_fMember<<endl;}
};
int main()
{
Father* pRealFather = new Father();
Child* pFalseChild = (Child*)pRealFather;
Father* pFalseFather = new Child();
//子赋给父
pFalseFather->testFunc();//调用父的
pFalseFather->testVFunc();//调用子的
//父赋给子
pFalseChild->testFunc();//调用子的
pFalseChild->testVFunc();//调用父的
pFalseChild->testNFunc();//调用子的
return 0;
}
Father testFunc 1
Child testVFunc 2:1
Child testFunc 0:1
Father testVFunc 1
Child testNFunc 0:1

普通的覆盖看指针属于什么调用什么的,属于编译期的多态
虚函数看对象属于什么调用什么的,属于运行期的多态
并且虚函数的类可以有实现,不影响构造
c++另命名了一个纯虚函数:
virtual void Display () = 0; // 纯虚函数
不用定义对象而只作为一种基本类型用作继承的类叫做抽象类(也叫接口类),凡是包含纯虚函数的类都是抽象类,抽象类不能实例化对象。
可见c++中纯虚函数与java的抽象方法是一致的,顺便c++没有单独定义的接口,c++的接口是用抽象类实现的,而且可以多继承…..

网上的:

1
2
3
4
5
6
C++ Java
虚函数 -------- 普通函数
纯虚函数 -------- 抽象函数
抽象类 -------- 抽象类
虚基类 -------- 接口 //这个还有待考证

目前先从语法使用角度分析,之后c++汇编时底层分析