C++

C++ Study Week One

Posted by LudoArt on March 23, 2019

第一周

一、 引用

1.1 引用的概念

int n =4;
int & r = n; // r引用了n,r的类型是int &

某个变量的引用,等价于这个变量,相当于该变量的一个别名

int n = 7;
int & r = n;
r = 4;
cout << r;  // 4

cout << n;  // 4

n = 5;
cout << r;  // 5

注:

  • 定义引用时一定要将其初始化成引用某个变量。
  • 初始化后,它就一直引用该变量,不会再引用别的变量。
  • 引用只能引用变量,不能引用常量和表达式。
int a = 7, b = 8;
int & r1 = a;
int & r2 = r1; // r2也引用a

r2 = 10;
cout << a;  // 10

r1 = b;     // r1没有引用b

cout << a;  // 8

1.2 引用的应用

1.2.1 引用作为函数的参数

void swap(int & a, int & b)
{
    int tmp;
    tmp = a; a = b; b = tmp;
}

1.2.2 引用作为函数的返回值

int n = 4;
int & SetValue() { return n; }
int main()
{
    SetValue() = 40;
    cout << n; // 40
    
    return 0;
}

1.3 常引用

int n = 100;
const int & r = n;
r = 200; //编译出错

n = 300; //没问题

二、const关键字

2.1 定义常量

const int MAX_VAL = 23;

2.2 定义常量指针

// 不可以通过常量指针修改其指向的内容

int n,m;
const int * p = & n;
* p = 5; // 编译出错

n = 4; // ok

p = & m; // ok,常量指针的指向可以改变

// 不能把常量指针赋值给非常量指针,反之可以

const int * p1;
int * p2;
p2 = p1; // 编译出错

p2 = (int *) p1; // ok

p1 = p2; // ok

三、动态内存分配

new 和 delete,较熟悉就不记了,注意释放数组时使用 delete [ ] a 即可

四、内联函数和重载函数

4.1 内联函数

// 内联函数:在函数定义前添加关键字“inline”

// 优点:减少函数调用的开销

// 缺点:程序体积增大

inline int Max(int a, int b)
{
    if(a > b) return a;
    return b;
}

4.2 重载函数

// 函数重载:一个或多个函数,名字相同,参数个数或类型不同 

// 若名字相同,参数个数和类型也相同,返回值类型不同,称之为函数的重复定义

int Max(double f1, double f2){}
int Max(int n1, int n2){}
int Max(int n1, int n2, int n3){}

4.3 函数的缺省参数

void func(int x1, int x2 = 2, int x3 = 3) { }
func(10); // ok

func(10, 8); // ok

func(10, ,8); // error

五、类和对象的基本概念

面向对象的程序设计 = 类 + 类 + 类 + ……

类 = 属性(成员变量) + 行为(成员函数)

// 矩形类

class CRectangle
{
    public:
    // 矩形的属性(宽和高)
    
    int w, h;
    // 矩形的行为(求面积、求周长、初始化)
    
    int Area(){
        return w * h;
    }
    int Perimeter(){
        return 2 * (w + h);
    }
    void Init(int w_, int h_){
        w = w_; h = h_;
    }
}

通过类,可以定义变量,类定义出来的变量,也成为类的实例,就是“对象”

int main()
{
    int w,h;
    CRectangle r; // r是一个对象
    
    cin >> w >> h;
    r.Init(w, h);
    cout << r.Area() << endl;
    return 0;
}

六、测验

6.1 难一点的swap

void swap(int *& a, int *& b) // 对int*类型的变量进行引用
    
{
	int * tmp = a;
	a = b;
	b = tmp;
}
int main()
{
	int a = 3,b = 5;
	int * pa = & a;
	int * pb = & b;
	swap(pa,pb);
	cout << *pa << "," << * pb;
	return 0;
}

6.2 神秘的数组初始化

int main()
{
	int * a[] = {NULL,NULL,new int,new int[6]}; 
	
	*a[2] = 123;
	a[3][5] = 456;
	if(! a[0] ) {
		cout << * a[2] << "," << a[3][5];
	}
	return 0;
}