(GeekBand)C++面向对象高级编程-第一周

课程目标:

培养正规的、大气的编程习惯
以良好的方式编写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 

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 

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

其中例1和例3的效果虽然是一样的,但是两者仍然有本质的区别,例3是通过操作指针副本改变了指向的内存中的变量,而例1是通过间接寻址操作的主调函数中的变量。


5.操作符重载与临时对象

本节中没有需要特别留意记录的点

你可能感兴趣的:((GeekBand)C++面向对象高级编程-第一周)