Code Reading
0 why
The purpose of this blog is to write down some useful tips in coding.
1 starting point of code:
- c/c++: main
- java: static void main
- Microsoft windows: WinMain
- Java applet or servlet hosts: init
2 基本流程/操作中的tips
this tip can make the if condition more concise
- && / and: only evaluate the righthand side when the lefthand side is evaluated as "true".
- || / false: only evaluate the righthand side when the lefthand side is evaluated as "false".
- eg: fragment from ECHO
1 if (*++argv && !strcmp(*argv, "-n")){ 2 ... 3 }
assignment expression(赋值表达式) in a logic express
- eg: fragment from ECHO
- int c = 0;
- while ((c = getopt (argc, argv, "t: ")) != -1) // first execute assignment expression, and compare the lefthand variable with "-1"(a possible return value of getopt, which means the end of parsing in getopt.)
3 static
https://www.runoob.com/w3cnote/cpp-static-usage.html
static 通常被认为同时具备全局和封装的特性。原因如下:
- 在普通的面向过程编程中,如果需要定义一个可供下次调用的变量时(使得变量在函数外依然有效),不选择全局变量而选择static要更好。原因是static的作用范围可以限制在文件内
#include <iostream> static int i; void Print(){ std::cout << "The " << ++ i << "th times call of Print()\n"; } void Test() { for (int i=0; i < 10; ++ i) { Print(); } } int main(){ i = 0; Test(); return 0; }
- 在面向过程的编程中,如果要在类对象之间共享一些数据,需要将变量定义为static类型
// MyTest.h class MyTest { public: MyTest(); ~MyTest(); void Print(); private: static int number_of_object; }; // MyTest.cpp #include "../include/MyTest.h" #include <iostream> int MyTest::number_of_object = 0; MyTest::MyTest() { ++ number_of_object; } MyTest::~MyTest() { } void MyTest::Print() { std::cout << "number_of_object = " << number_of_object << std::endl; } // main.cpp #include "./include/MyTest.h" void Test(){ for (int i=0; i<10; ++ i) { MyTest t1; t1.Print(); } } int main() { Test(); return 0; }
4 const
- 一个const对象不能调用非const成员函数: 因此在传递类对象时,形参以及实参不应该是const类型的,否则将无法调用非const的成员函数
5 c++ 模板类与继承
http://c.biancheng.net/view/324.html
类模板和类模板之间,类模板和类之间可以互相继承。
6 c++ 中的typename
https://blog.csdn.net/vanturman/article/details/80269081
类似于 templace <class T>中的class,是类型名关键字,表明接下来出现的东西是类型名。
eg: template<typename T> class A: public T{ T t; }; typedef class_a A; typedef typename A::t my_t;
7 C++ 继承中关于子类构造函数的写法
https://www.cnblogs.com/shmilxu/p/4849097.html
1. 如果子类没有定义构造方法,则调用父类的无参数的构造方法。
2. 如果子类定义了构造方法,不论是无参数还是带参数,在创建子类的对象的时候,首先执行父类无参数的构造方法,然后执行自己的构造方法。
3. 在创建子类对象时候,如果子类的构造函数没有显示调用父类的构造函数,则会调用父类的默认无参构造函数。
4. 在创建子类对象时候,如果子类的构造函数没有显示调用父类的构造函数且父类自己提供了无参构造函数,则会调用父类自己的无参构造函数。
5. 在创建子类对象时候,如果子类的构造函数没有显示调用父类的构造函数且父类只定义了自己的有参构造函数,则会出错(如果父类只有有参数的构造方法,则子类必须显示调用此带参构造方法)。
6. 如果子类调用父类带参数的构造方法,需要用初始化父类成员对象的方式。
8 c++ 普通函数与虚函数调用的区别
https://www.cnblogs.com/likui360/p/6369915.html
9 C++ class forward declaration
class A;
# include "A.h"