构造函数是producted属性的创建方法

构造函数是producted属性的创建方法:

如下声明的构造函数:

protected:
    CWeb();           // 动态创建所使用的受保护的构造函数
    virtual ~CWeb();

创建方法如下:

CRuntimeClass * pRuntimeClass = RUNTIME_CLASS(CWeb);
CObject* pObject = pRuntimeClass->CreateObject();
ASSERT(pObject->IsKindOf(RUNTIME_CLASS(CWeb)));
m_pWeb = ((CWeb*)pObject);  // m_pWeb为自己定义的CWeb类指针

之后使用m_pWeb就可以了。

gdb的感性认识

编译时要加调试函数(-g): g++ -g hello.cpp -o hello

l: 列出代码
break 2: 在第2行加断点
break func:设置断点,在func()函数入口处
info break:查看断点信息
r: 运行程序(run的简写)
n: 单条语句执行(next)
c: 继续向下执行(continue)
p i: 答应变量i的值(print)
bt: 查看函数堆栈
finish: 退出函数

关于c++中const成员函数

const对象只能访问const成员函数,而非const对象可以访问任意的成员函数,包括const成员函数.

class CTest
{
public:
    CTest(const CTest& t) // 这里t是const修饰的类的引用,它所调用到的方法应该是const成员函数
    {
        a = t.Fun(); 
    }
    int Fun()  // const成员函数
    {
        return a;
    }
private:
    int a;
};
int main()
{
    return 0;
}

关于C++指针的引用

注意,只有指针的引用(*&)

没有引用的指针这么一说,引用的指针(&*)编译也是绝不可能通过的

指针的引用,代码如下:

#include <iostream>
using namespace std;
class A
{
public:
    int m_a;
};
void f(A * &a)
{
    cout << (a)->m_a << endl;
}
int main()
{
    A a;
    a.m_a = 88;
    A *p = &a;
    f(p);
    return 0;
}

分析的时候从右向左分析
f(A * &a)
先是 & , 表明这是一个引用
然后是 *
表明这是一个指向 A* 的引用

C++应用程序在Windows上的启动过程

一个C++应用程序的启动过程:

其实是系统调用CRT,然后CRT调用的WinMain.

a.shell调用CreateProcess激活App.exe
b.系统产生一个进程内核对象,使用计数值加1
c.系统为此进程产生4GB的地址空间
d.加载器将必要的码加载到上述地址空间中,包括App.exe的程序,资料以及所需要的dll。它们被记录在可执行文件PE格式的.idata section中。
e.系统为此进程建立一个执行线程,即主线程。执行线程才是CPU时间的分配对象。
f.系统调用C Runtime函数库的StartUp code
g.startup code调用APP程序的WinMain函数
h.APP程序开始运作
i.使用者关闭APP,退出消息循环,退出WinMain函数
j.返回到startup code
k.返回到系统,系统调用ExitProcess结束进程。

C++中ostringstream和istringstream的理解

今天脑子抽风,突然分不清ostringstream为什么叫输出, istringstream为什么叫输入.

抽过之后,做出如下总结,以防再抽.

输入输出是针对std::string而言的
输出流:格式化以后输出到std::string
输入流:绑定std::string str之后把str里的一个word输入到另一个std::string中,用于处理字符串

总结: 输入输出,站在流本身的角度来看。

关于C++模板中的嵌套依赖类型名与typename

typename一共就两种用法

①修饰模板参数,说明它是一个类型.此时可以用class关键字来代替.

②修饰嵌套依赖类型名

关于第②点要说明如下:

  1. 依赖类型名: 一个模板中的 依赖于一个模板参数的名字.
  2. 嵌套依赖类型名: 嵌套在一个类内部的一个依赖类型名

比如:

std::list

首先,它是一个依赖于模板参数的类型,所以它是一个依赖类型名

其次,它也是一个嵌套在std内部的类型,所以它是 嵌套依赖类型名,需要用typename来修饰.如下:

typename std::list m_lstT;

记住:

在涉及到一个模板中的嵌套依赖类型名的任何时候,都必须把typename放在紧挨着它的前面.