1.#pragma once 保证头文件只编译一次,防止头文件的重复包含。#pragma once 这个杂注释与编译器相关的,而不是C/C++ 的基本语法。因此对于不支持#pragma once的编译器建议使用 #ifndef #define #endif
2. Vector中用eraser删除元素只会删除vector容器中的元素,如果容器中是指针,eraser是不会联级地delete指针指向的空间的,因此会造成内存泄露。所以在删除指针元素之前,要判断是否有必要联级地delete指针指向空间的内容(有可能指针指向的也是一个指针,然后指针....最后一个指针才指向一个内存空间),然后再eraser掉vector中的指针。
3. WM_COMMAND 和其他的消息都一样( WM_LBUTTONDOWN 、 WM_MOUSEMOVE 、 WM_MOUSELEAVE )都是一种单独的消息,只是这个消息是子窗口向父窗口发送的,目的就是交给父窗口去处理。
4. SQL中查找和删除表中的重复数据
查找:select * from table1 where num in (select num from table1 group by num having count(num)>1)
删除:delete from table1 where num in (select num from table1 group by num having count(num)>1)
注意:删除是逐条进行的,每删除一条数据,都会对剩下的数据进行重新分组,重新统计每组的个数。因此当某条数据被删除到只剩一条的时候,在下一次进行分组统计的时候就不会在被删除的集合中了。自然就删除了所有重复的数据。
5. 复制表和拷贝表的SQL
复制表(仅复制表结构,不复制数据)
Select * into B from A where 1=0
拷贝表
Select * into B from A (where 1=1)//可不写“()”中数据
6. update 一次只能更新一条数据。如下为错:update table1 set name = (select name from table2 t2 inner join table1 t1 on t2.id = t1.id)
子查询返回的是一个结果集,不是单条数据。
7.函数指针
1)声明一个指针数组,该数组有10个元素,每个元素类型是一个有一个int参数且返回值为int的函数指针
int (*f[10])(int)
2)声明一个函数指针,该函数指针是一个有两个int参数且返回类型是一个有着一个int参数同时返回一个int的函数指针
int (*(*f)(int,int))(int)
8.delete 一个指针后,释放的是指针指向的内存内容,这是指针变成了迷途指针,记得要将该指针指向NULL。
9.在C++继承的对象模型中,子类是嵌套基类的成员变量的,但是注意仅仅是成员变量在对应对象的内存空间中,那么成员函数的入口地址存在哪里去了呢?
1)非虚函数:在编译阶段就已经确定,编译器会将对应的成员函数放在一个符号表中,对某个类成员函数的调用就直接转换成对应的汇编语言call 0Xxxxxxx。
2)虚函数:有个虚函数表,虚函数原理见:《C++ 虚函数表解析》
试举一例:
class C
{
public:
void f();
private:
int c1;
};
class E
{
public:
void f();
private:
int e1;
};
class F:public C,public E
{
public:
void f();
private:
int f1;
};
F的内存对象模型:
然后:
F f;
F.f();//call 0xXXXXXXX
F.E::f();//call 0xYYYYYYY
所以编译成汇编语言的时候二者调用的不是同一个内存地址。
10.
63.typeid运算符返回值是type_info(类)的常量对象的引用,有成员函数name()
例如:int *a[2];
cout<<typeid(a).name()<<endl;// int * [2]