从构造函数到this指针

//day2:构造函数、copy构造函数、析构函数、静态成员函数/变量、成员对象/封闭类、友元类/函数、this指针、常对象/成员函数/引用
1.构造函数
class Complex
{
private:
double real, imag;
public:
void Set(double r, double i);
Complex(double r, double i = 0);
};
Complex::Complex(double r, double i):real®,imag(i)
——格式:Complex::Complex(para_list);//无返回值,并不是void;若用户不自定义,编译器自动生成默认constructor
——Why?给成员变量赋初值。省得还得另行设计初始化函数。创建对象相当于建房子,初始化相当于装修
进一步为什么要记得初始化,因为对象要是不初始化可能会闹笑话,比如:学生这个类,身高作为变量,不初始化有可能被OS分配一个负数值。
——创建指向类类型的指针时,constructor会被调用吗?
答:看情况,若指针被初始化了,则会。也就是说只要有新的内存为新对象分配,就会调用construtor.如:Complex * pc = new Complex;//会被调用
——private属性的constructor可以用来初始化对象吗?//答:不能直接
——对象数组
练习:
class Test {
public:
Test(int n){} //(1)
Text(int n, int m){} //(2)
Test(){} //(3)
};
判断(1)(2)(3)谁被调用?
Test array1[3] = {1, Test(1,2)};

Test array2[3] = {Test(2,3), Test(1,2),1};

Test *pArray[3] = {new Test(4), new Test(1,2)};

2.内联成员函数
——两种方式:定义在类内部,外部+inline
3.copyConstructor
——格式:A::A(A & ); or A::A(const A &);//class A;不能用A::A(A);用户若不自定义,则编译器默认的会完成复制。自定义的就不一定了。
——Why:类似于int a = 3;int b = a; 可以用现存的对象去初始化另一个同类的新对象,多好。
——起作用的三种情况:
a1初始化a2;A a1; A a2(a1);
函数的参数有类A的对象;//类似于传值调用要先把实参复制一份
函数的返回值有类A的对象
class A
{
public:
int v;
A(int n){v = n};
A(const A & a){
v = a.v;
cout<<“Copy constructor called”< }
};
A Fun(){
A b(4);
return b; //这里调用copyConstructor,如果自定义的没有完成复制的话,会出现函数值不等于返回值的情况。
};

int main(){
	cout<

——所以,类似于只要为新对象开辟空间就调用constructor,只要发生了对象的复制,就会调用copyConstrutor。

4.类型转换构造函数
class Complex{
public:
double real, imag;
Complex(int i){
cout<<“IntConstuctor called”< real = i;imag = 0;
}
Complex(double r, double i)
{real= r; imag = i}
};

int main(){
Complex c1(7,8);
Complex c2 = 12;//这是初始化
c1=9;//9被自动转换成Complex类型
}

5.析构函数
——先构造的后析构
——不一定和构造函数一一对应,比如有些时候会调用复制构造函数生成临时对象。

6.静态成员变量、函数
——格式
——静态成员就一份,为所有对象共享。而普通成员每个对象独享。
——静态成员函数并不具体作用于某一对象。本质上是全局函数。
——why:是为了和某些类紧密相关的全局变量和函数写到类里面,看上去像一个整体。比如:考虑一个需要随时知道矩形总数和总面积的图形处理程序。可以用全局变量来记录总数和总面积。并将其封装到类中,便于维护和理解
——必须在定义类的文件中对静态成员变量进行一次说明或者初始化
——静态成员函数可以访问非静态成员变量吗?不能,因为静态成员函数并不作用于某一个具体的对象,那访问的那个非静态成员到底是属于哪个对象说不清楚。。。也就是说普通成员函数访问的都是所作用的对象的成员。同理递进所以静态成员函数也不能调用非静态成员函数。

7.成员对象/封闭类
——一个类的成员变量是另一个类的对象
——包含成员对象的类称为封闭类。
——生成封闭类的对象时,要明确对象中的成员对象
——调用顺序

8.友元函数、有缘类
——A是B的友元,B是C的友元,那么A是C的吗

9.this 指针
——先考虑从C++翻译成C语言
——this的引入是为了 指向成员函数所作用的对象(和static一块理解)
——why静态成员函数不能使用this指针?
TODO:例子

10.常对象、常成员函数、常引用
——常成员函数,类似于常引用,常量指针,不能通过其修改成员变量,所以也不能调用非常成员函数。。但是静态的可以被修改,因为不独属于某一个对象。

你可能感兴趣的:(C++学习日记)