学习笔记——3月4日

#pragma pack(1)  

struct A  
{  
  enum day{monring, moon, aftermoon};   
};  
sizeof(A) //1  
sizeof(A::day) //4  
为什么sizeof(A)为1,而sizeof(A::day)为4?

 

http://topic.csdn.net/u/20090323/17/7f78dfbd-8858-47af-acf4-68ffacdf9b30.html

 

1、基类指针指向派生类对象和派生类指针指向基类对象

 

 

2在C++中禁止类继承

 在CoreJava 7 中提到C++中没有类似final的关键字,因此无法直接实现禁止类继承,但是 Cay S. Horstmann又说可以通过一些小技巧达到同样的效果,留作思考,但提示说用到虚基类。
   究竟是如何的“技巧”呢,很惭愧,虚基类忘得快没影了,于是Google大神之,摘录如下:

   下面的代码将会禁止继承:

class A;
class Lock {
friend class A;
private:
Lock() {}
}
;
class A : virtual public Lock {
// 
public:
A(){}
A(int t){}
}
;

现在,如果你尝试从类A派生其它类将会得到类似下面这样的编译错误。 

class B : public A{}; // Lock::Lock' : cannot access private member declared in class 'Lock'

 

   这是因为派生类都需要调用虚基类的构造函数,因此从A派生的B需要调用虚基类的构造函数(也就是Lock的构造函数),而Lock的构造函数是私有的,类B又不是Lock的友元,所以这将会产生一个编译错误。 
   如果我们移除类A派生时的virtual关键字,程序将会成功编译。这是因为在非虚拟继承中,任何类都可以调用直接父类中的构造函数。因此,在非虚拟继承中,B将调用它的直接父类A的构造函数而A将调用它的直接父类Lock的构造函数,这都是合法的。

 

 

 

 

3、inline和template

inline函数和templates两者通常都定义于头文件中。

 

inline函数通常一定被置于头文件内,因为大多数建置环境在编译过程中进行inline,而为了将一个“函数调用”替换为“被调用函数本体”,编译器必须知道那个函数长什么样子。

 

inlining在大多数C++程序中是编译期行为。

 

templates通常也被置于头文件内,因为它一旦被调用,编译器为了将它具化,需要知道它长什么样子。

 

 

templates的具现化与inlining无关。根据需要可将templates声明为inlined。

 

 

大部分编译器拒绝将太过复杂(例如带有循环或递归)的函数inlining,而所有对virtual函数的调用也都会是inlining落空。

因为virtual意味着“等待,知道运行期才确定调用哪个函数”,而inlining意味“执行前,先将调用动作替换为被调用函数的本体”。

 

编译器通常不对“通过函数指针而进行的调用”实施inlining。

inline void Fun()

{

cout<<"Hello World!"<<endl;

}

 

void (*pFun)() = Fun;

 

int main()

{

Fun(); //这个调用将被inlined,因为它是一个正常的调用

 

pFun(); //这个调用或许不被inlined,因为它通过函数指针完成

return 0;

}

 

4、
::作用域符(scope operator)分:
1)全局作用域符
2)类作用域符
3)命名空间作用域符
在运算符等级中属于最高级的!
在你的问题中,似乎说的只是命名空间作用域符。
using namespace 命名空间名(如,abc);
表示在以下程序代码中所使用的标示符(如果此标示符在abc中定义)是abc中的,包括类型名(类),变量名,函数名,对象名。。。
using abc::标示符(i);
只表示在以下代码中使用的标示符i是abc中的。
如果你要使用abc中的多个标示符的话,你就只能用
using abc::a;
using abc::b;
using abc::c;
...
等一个一个列举出来!
当然用using 语句是比较方便的
但是不安全
(1)using namespace;万一不同的两个命名空间中使用了同名的标示符,系统则不能判断,这个标示符是属于哪个命名空间的;
(2)using abc::;万一你的程序中也用到了一个函数(函数名与abc中的这个函数同名),那么系统也不能判断你使用的是abc中的那个函数,还是本程序中的那个函数;
最安全的办法(当然也是最繁琐的)
就是,每当你用到一个变量(函数...)时,你都要明确他的来历(即属于哪个命名空间)除非它没有命名空间
5、重载操作符new
http://www.relisoft.com/book/tech/9new.html
6、OutputDebugString
#include "stdafx.h"
#include <Windows.h>
#include <iostream>
using namespace std;
int main()
{
cout<<__FILE__<<endl;
wchar_t *str = L"wwwwww";
OutputDebugString(str);
}
7、
C++编译器不能支持对模板的分离式编译
http://blog.csdn.net/june_wu/archive/2009/05/28/4222245.aspx
8、
《C++沉思录》笔记---代理类
http://mooncui.javaeye.com/blog/123580
http://www.moon-soft.com/doc/7913.htm
http://www.cn-doc.com/_soft_ect_lang_tech_doc/2005_08_19_21/200
50819210021117.htm
C++中代理类和句柄类
http://www.cnblogs.com/yc_sunniwell/archive/2010/07/12/1775619.html
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值