在涉及到友元类方法的时候会用到向前声明,至于为什么要使用向前声明我还是直接上例子理解的快:
在Tv类中Remote
类中的set_chan()
方法设为友元类方法,也就是Remote
的这个方法是可以访问Tv
的私有成员数据的(包括修改)。1
2
3
4
5class Tv
{
friend void Remote::set_chan(Tv & t, int c);
...
}
可以看到,既然是Tv类的友元,set_chan
中自然要有Tv
类的变量,但是编译器在编译Remote
类的时候至少要知道Tv这个东西是个自定义的类,不然会报错,所以应该把Tv类声明在Remote类的前面。但是Tv类中由于将Remote中的方法设为自己的友元,所以编译器也要知道Remote::set_chan(Tv & t, int c)
中的Remote以及它的方法是在哪里,不然也会报错。这样就前后矛盾了。
Home
2016-03-14
2016-03-12
C++ 是 Google 大部分开源项目的主要编程语言。正如每个 C++ 程序员都知道的,C++ 有很多强大的特性,但这种强大不可避免的导致它走向复杂,使代码更容易产生 bug,难以阅读和维护。
Google 经常会发布一些开源项目,意味着会接受来自其他代码贡献者的代码。但是如果代码贡献者的编程风格与 Google 的不一致,会给代码阅读者和其他代码提交这造成不小的困扰。Google 因此发布了这份自己的编程风格,使所有提交代码的人都能获知 Google 的编程风格。
创新工场董事长兼 CEO 李开复曾经对 Google C++ 编码规范给予了极高的评价:“我认为这是地球上最好的一份 C++ 编程规范,没有之一,建议广大国内外 IT 研究使用。”
2016-03-11
之前有总结过C++的函数模板具体化,里面按照隐式实例化、显式实例化和显式具体化来总结的。
类似函数模板的具体化,类模板具体化除了上面三种具体化方式还有一种叫部分具体化,下面简单总结下:
隐式实例化
这是最常使用的类模板实例化的方式,在<>
中指出对象所需的类型,编译器使用通用模板提供的方式生成具体的类定义,编译器在程序需要对象之前不会隐式实例化生成类的具体定义的。1
ArrayTP<int, 10> stuff; // 编译器使用参数int和10生成类定义然后生成对象并命名为stuff
2016-03-10
在C++中使用面向对象思想的类继承,我觉得最关键的还是要理解父类是如何把成员继承给派生类的。
只要理解了上面这点,在写派生类的各种方法(构造函数,赋值函数等)的时候把父类甚至是父类的父类当作独立的未命名的对象来处理关系就会非常的明确了。
2016-03-09
我说上次为啥在实现文件中定义内联函数的时候,编译器说找不到函数定义。看来还是书没看仔细啊。
内联函数的链接性是内部的,这意味着:内联函数定义必须在使用函数的文件中
因此将内联函数的定义放入头文件中,可以在使用函数的文件中包含头文件确保能找到内联函数的定义。
若想将函数定义放入实现文件中,对不起,请把inline
关键字删掉吧,这样函数的链接性才是外部的。