课程目标:
培养正规的、大气的编程习惯
以良好的方式编写C++ Class
学习Classes之间的关系
这也是我这次参加这次课程的目标,希望可以学习到良好、正确的面向对象编程方法。
第一周课程内容
1.C++编程简介
推荐书籍:
- 基础类:《C++ Primer 5th》、《The C++ Promgramming Language》
- Effective系列:Effective C++ 3th、More Effective C++..
- STL基础库方面:STL源码剖析
2.头文件与类的声明
Classes的两个经典分类:
- Class without pointer members
- Class with pointer members
inline(内联)函数
编译器会优化inline函数,因此允许的情况下尽量使用inline函数,同时GoogleC++格式声明中建议10行以内的函数,使用inline函数
本节课程中,提到一个编程的细节
Header文件中的防卫式声明
#ifndef __MYCOMPLEX__ #define __MYCOMPLEX__ ... #endif //__MYCOMPLEX__
防止头文件的内容被多次包含
私以为,对于C++语言而言,良好的编程习惯尤其重要
3.构造函数
此节中侯老师建议:编写程序时,语法允许的情况下应当多使用简洁、明了的写法,这样写出的代码易读易改。例如:
class complex { public:
complex (double r = 0, double i = 0)
: re (r), im (i)
{}
}
4.参数传递与返回值
- pass by value
- pass by reference
pass by reference 效率更高,但要注意有些情况不能使用return by reference
在写函数的时候,要考虑清楚到底该不该使用关键字const
C++中引用与指针的区别
听课时,对指针和引用的概念和之间的区别不是很清楚,以下是Google之后结合自己以前学习Pascal的理解
首先从概念上讲指针本质上是存放类的地址的变量,是可以改变的。引用是对象的别名,引用的存在必须依附于一个对象,并且在引用的生命周期内是不能改变的。
在使用指针和引用传递参数时,两者有本质的区别:指针传递参数本质上仍然是值传递,指针传进函数中后会在栈中创建指针的副本,在函数中所有的操作都是对指针副本的操作。而对引用参数的处理都会通过间接寻址的方式操作到主调函数中的相关变量。如果想通过指针参数传递来改变主调函数中的相关变量,那就得使用指向指针的指针,或者指针引用。
下面是三个例子说明引用和指针在函数参数传递时
- 例1:
#include <iostream>
void func1(int &pMyint);
int main() {
int test = 1;
int *p = &test;
printf("%p\n", p);
printf("%d\n", test);
func1(*p);
printf("%p\n", p);
printf("%d\n", test);
return 0;
}
void func1(int &pMyint){
int test = 10;
pMyint = test;
}
运行结果为:
0061ff28
1
0061ff28
10
- 例2:
void func1(int *pMyint);
int main() {
int test = 1;
int *p = &test;
printf("%p\n", p);
printf("%d\n", test);
func1(p);
printf("%p\n", p);
printf("%d\n", test);
return 0;
}
void func1(int *pMyint){
int test = 10;
pMyint = &test;
}
运行结果为:
0061ff28
1
0061ff28
1
- 例3:
#include <iostream>
void func1(int *pMyint);
int main() {
int test = 1;
int *p = &test;
printf("%p\n", p);
printf("%d\n", test);
func1(p);
printf("%p\n", p);
printf("%d\n", test);
return 0;
}
void func1(int *pMyint){
int test = 10;
*pMyint = test;
}
运行结果为:
0061ff28
1
0061ff28
10