Lesson02---类与对象(上篇)

lesson4:

一、如何理解面向过程和面向对象(0:42:0)(看课件)

1.C++是纯面向对象吗?为什么?

二、类的引入(0:49:0)

1.C语言和C++做比较

a.C语言如何定义一个栈?(0:49:30)
①定义栈后如何使用?(0:49:50)
b.C++兼容C语言struct语法吗?(0:51:10)
①C++将struct升级成了XX(0:51:40)
②跟C语言相比,C++除了可以定义变量,还可以定义什么?(0:52:0)
③跟C语言相比,函数取名的优势(0:52:40)
④跟C语言相比,函数形参的优势(0:53:15)
⑤跟C语言相比,结构体定义变量的优势(0:54:50)
⑥定义next的时候,它的类型好复杂,可以在声明结构体的时候typedef,然后简化next的类型吗?(0:56:30)
struct ListNode
{
	struct ListNode* next;
	int value;
};
Ⅰ.C++是怎么定义的?(0:57:5)

三、访问限定符

1.如何理解private修饰的成员在类外不能直接被访问?(1:5:30)

a.class的默认访问权限是XX,struct是XX(1:6:10)
①为什么struct默认是public?
b.什么是公有?(1:6:27)
c.什么是私有?(1:6:35)

2.访问限定符的作用范围(1:8:20)

3.私有限制成员变量不能XX(1:9:0)

4.现阶段,private和protected是一样的,都是在类外面不能访问,类里面可以访问。在继承那里才有区别。

5.面试题:C++中的struct和class的区别是什么?(1:12:30)

四、类的定义方式

1.定义方式有几种?(1:13:0)

2.什么是类里面声明和定义?(1:13

a.在类里面定义,编译器可能会干嘛?(1:13:45)
①可能是什么意思?(1:14:0)

3.什么是声明和定义分离?(1:16:50)

a.直接在.cpp文件中这样定义可以吗?(1:20:0)
void Init()
{
	//...
}
①被{}括起来的是一个XX(1:20:10)
Ⅰ.被函数{}括起来的是XX(1:20:20)
Ⅱ.命名空间{}括起来的是XX,作用是什么?(1:20:23)
Ⅲ.域要么影响XX,要么影响XX(1:20:30)
Ⅳ.类域影响的是什么?(1:20:45)
②怎么修改才正确?(1:20:50)
Ⅰ.加了类名是什么意思?(1:22:30)
b.成员函数声明和定义分离,还能是内联函数吗?(1:23:35)
①声明里面添加inline关键字,还是内联吗?(1:23:45)
Ⅰ.为什么?(1:24:35)

3.类的定义应当遵守的规则(1:25:20)

a.小函数怎么处理?(1:25:35)
b.大函数怎么处理?

4.访问限定符限不限制类里面?(1:27:0)

5.在类体外使用定义成员,需要干嘛?(1:28:45)

a.添加了类名和不添加类名的函数,找变量的区别?

五、

1.面向对象只有3种特性吗?(1:30:50)

2.封装的本质?(1:31:35)

3.封装是通过XX,将XX和XX结合到了一起(1:31:44)

a.它如何将你想访问的,设置成共有?(1:31:54)
b.它如何隐藏对象的属性和实现细节?(1:32:0)

4.以下能成功取到栈顶元素吗?(1:33:45)

class Stack
{
private:
	int* _a;
	int _top;
	int _capacity;
};

int main()
{
	Stack st;
	cout << st._a[st._top] << endl;
}
a.如何修改,能够取到栈顶的元素?(1:34:20)
①这样做的好处?(1:36:10)
Ⅰ.两个top的位置不同的原因?(1:37:55)

5.C语言和C++在封装的区别?(1:39:30)

Lesson5:

一、

1.域本质上不是影响生命周期,而是XX(0:17:50)

2.什么是影响生命周期的东西?(0:20:0)

3.作用域影响的是什么?(0:21:28)

4.以下程序运行的时候会报错吗?(0:22:20)

class Person
{
public:
	void PrintPersonInfo();
private:
	char _name[20];
	char _gender[3];
	int  _age;
};

void PrintPersonInfo()
{

}
a.函数重载指的是同一个作用域还是不同的作用域?(0:22:44)
b.不同的域可以有同名吗?(0:23:0)
c.下面的那个PrintPersonInfo属于什么域?(0:23:0)
d.以下程序运行的时候会报错吗?(0:23:15)
class Person
{
public:
	void PrintPersonInfo();
private:
	char _name[20];
	char _gender[3];
	int  _age;
};

void PrintPersonInfo()
{
	cout << _name << " " << _gender << " " << _age << endl;
}
①为什么会报错呢?(0:23:20)
②如何修改,可以让里面的变量找到类里对应的成员变量?(0:23:40)
e.生命周期跟什么有关?(0:24:10)

5.类的声明和定义的区别(0:25:25) 

a.只有声明没有定义会造成XX(0:26:15)
b.链接失败的本质(0:26:24)
c.char _name[20];是声明还是定义?(0:26:40)
class Person
{
public:
	void PrintPersonInfo();
private:
	char _name[20];
	char _gender[3];
	int  _age;
};
// 这里需要指定PrintPersonInfo是属于Person这个类域
void Person::PrintPersonInfo()
{
	cout << _name << " " << _gender << " " << _age << endl;
}
①函数的声明和定义怎么区分?(0:27:0)
②变量的声明和定义如何区分?(0:27:20)
Ⅰ.第一行的全局域中的int age;是声明还是定义?(0:28:5) 
int age;

class Person
{
public:
	void PrintPersonInfo();
private:
	char _name[20];
	char _gender[3];
	int  _age;
};
// 这里需要指定PrintPersonInfo是属于Person这个类域
void Person::PrintPersonInfo()
{
	cout << _name << " " << _gender << " " << _age << endl;
}
d.什么时候类里面的成员变量才开辟空间?(0:32:0)
①定义类的对象的过程叫做什么?(0:32:30)
②没开空间的时候,对sizeof(Person),sizeof怎么计算Person类的大小?(0:33:10)
Ⅰ.类占空间吗?(0:33:30)
Ⅱ.那什么时候才占空间?(0:33:35)
Ⅲ.里面的变量能不能存储数据?(0:34:30)
class Person
{
public:
	void PrintPersonInfo();
private:
	char _name[20];
	char _gender[3];
	int  _age;
};
Ⅳ.sizeof怎么计算出类的大小的?(0:35:0)

6.为什么这个Person.h文件作为test.cpp和Person.cpp的头文件,链接的时候会报错?(0:36:25)

int age;

class Person
{
public:
	void PrintPersonInfo();
private:
	char _name[20];
	char _gender[3];
	int  _age;
};
a..h文件中要谨慎定义XX?(0:37:20)
b.如何确保定义了全局变量且不会出链接错误?(2点)(0:37:40)
①extern使得全局变量由定义变成了XX(0:38:0)
Ⅰ.只在.h文件添个extern就可以了吗?(0:38:30)
②除了extern以外,还有没有其它的解决方式?(0:41:35)
Ⅰ.extern int age(声明)写在Person.h,int age(定义)写在Person.cpp,请问Test.cpp是怎么拿到age的?(0:48:45)
③它俩的区别是什么?(0:42:20)
int age;

static int age;
Ⅰ.Test.cpp经头文件展开,得到的static int size会写进符号表吗?(0:43:35)
Ⅱ.Test.cpp和Person.cpp内的static int age是同一个吗?(0:45:5)
④在Person.cpp内定义一个全局变量int age;,在Person.h内声明extern int age;,那么在Person.cpp和Test.cpp打印出来的是同一个吗?(0:45:55)

二、

1.运行结果是8吗?(0:53:30)

class A
{
public:
	void PrintA()
	{
		cout << _a << endl;
	}
private:
	char _a;
};

int main()
{
	cout << sizeof(A) << endl;
}

2.类对象的存储方式(3种)(0:54:0)

a.采用的是第几种方式?(1:0:40)

3.第一种存储方式

a.aa1的a和aa2的a是同一个a吗?(0:55:45)
class A
{
public:
	void PrintA()
	{
		cout << _a << endl;
	}
private:
	char _a;
};

int main()
{
    A  aa1;
    A  aa2;
    A  aa3;
    aa1._a = 1;
    aa2._a = 2;
}
b.aa1调的PrintA()和aa2调的PrintA()是同一个PrintA吗?(0:56:10)
class A
{
public:
	void PrintA()
	{
		cout << _a << endl;
	}
private:
	char _a;
};

int main()
{
    A  aa1;
    A  aa2;
    aa1.PrintA();
    aa2.PrintA();
}
c.实例化的每个A对象,成员变量都是XX,成员函数都是XX(0:57:20)
①如何验证?(0:58:20)
d.这种存储方式的缺点(0:58:55)

4.第二种存储方式(0:59:20)

a.这种方式在这里被采用了吗?(1:0:25)
b.这种方式在哪里被采用了?(1:0:30)

5.第三种存储方式(1:1:0)

a.成员函数在什么阶段就确定函数地址了?(1:2:55)
b.以下程序运行结果是崩溃、编译报错、还是正常运行?(1:6:10)
class A
{
public:
	void funcA()
	{
		cout << "void A::func()" << endl;
	}
private:
	char _a;
};

int main()
{
	A* ptr = nullptr;
	ptr->func();
}
①为什么如果采用第一种和第二种存储方式,运行会崩溃?(1:6:25)
②调用func的时候,ptr有没有解引用?(1:7:0)
③函数func存在ptr指向的对象里面吗?(1:7:20)

6.有声明就会进符号表吗?(1:14:50)

7.什么是链接错误?(1:15:4)

8.运行结果是多少?(1:16:40)

class A
{
public:
	void PrintA()
	{
		cout << _a << endl;
	}

	void funcA()
	{
		cout << "void A::func()" << endl;
	}
private:
	char _a;
    int _i;
};

int main()
{
	cout << sizeof(A) << endl;
}
a.为什么?(1:16:55)
①如何计算对齐数?(1:17:30)

9.A2和A3的大小一样吗?(1:38:25)

// 类中仅有成员函数
class A2 {
public:
   void f2() {}
};


// 类中什么都没有---空类
class A3
{};

int main()
{
	cout << sizeof(A2) << endl;
    cout << sizeof(A3) << endl;

    A2 aa2;
    A3 aa3;
}
a.为什么?(1:38:40)
b.结果是多少?(1:39:0)
①为什么不是0?(1:39:25)
Ⅰ.假如为0,那么aa2和aa3的地址怎么区分?(1:39:45)
Ⅱ.这1字节是用来干嘛的?(1:40:20)
Ⅲ.这1字节存储实际数据吗?(1:40:30)

三、this指针

1.为什么成员变量命名前习惯上要加_?(1:44:55)

2.成员函数存储在公共代码区,那么d1和d2调用Print()函数打印的结果是一样的吗?(1:51:0)

#include <iostream>
using namespace std;
class Date
{
public:
	void Init(int year,int month,int day)
	{
		_year = year;
		_month = month;
		_day = day;
	}
	void Print()
	{
		cout << _year << "-" << _month << "-" << _day << endl;
	}
private:
	int _year;
	int _month;
	int _day;
};

int main()
{
	Date d1;
	d1.Init(2023, 8, 20);

	Date d2;
	d2.Init(2023, 8, 21);

	d1.Print();
	d2.Print();
}
a.空间上,Init()成员函数中的_year取自成员变量中的_year吗?(1:52:40)
①那它取自哪里?(1:53:0)
b.所有的成员函数第一个位置都有一个隐含的参数this指针吗?(1:53:20)
①编译器编译时会如何处理类中的成员函数?(1:54:10)
Ⅰ.const修饰的是谁?(1:54:40)
Ⅱ.Date* const this意味着this指向的成员对象地址不可更改!!!
②类对象调用的成员函数会被处理成什么样子?(1:56:10)
③下面的init函数存储在公共代码区,它怎么知道调用后修饰的是d1对象的变量?(1:56:55)
	Date d1;
	d1.Init(&d1,2023, 8, 20);
Ⅰ.Init函数中的变量_year,_month,_day是如何被访问的?(1:57:10) 
④实参和形参的位置可以显式地传递和接收this指针吗?(2:1:25)
⑤可以在成员函数内部使用this指针吗?(2:0:5)
Ⅰ.可以在函数内部打印this指针吗?(2:0:20)
Ⅱ.this指针可以被修改吗?(2:0:24)

3.以下程序正常运行吗?

class A
{
public:
	void Print()
	{
		cout << "Print()" << endl;
	}
private:
	int _a;
};
int main()
{
	A* p = nullptr;
	p->Print();
	return 0;
}
a.p->Print()传给成员函数内的this指针的是p的地址还是p的值?(2:4:25)

4.以下程序正常运行吗?(2:5:40)

class A
{
public:
	void PrintA()
	{
		cout << _a << endl;
	}
private:
	int _a;
};
int main()
{
	A* p = nullptr;
	p->PrintA();
	return 0;
}

5.什么是编译报错?(2:9:55)

6.this指针存在地址空间的哪个区?(2:10:30)

a.为什么?(2:10:45)
b.为什么this指针是存在对象里吗?(2:11:25)
c.this指针一定存在栈区吗?(2:15:10)
①一定会优化吗?(2:15:50)

7.以下程序会报错吗?(2:27:17)

class A
{
 public:
	int _a;
};

int main()
{
	A* a = nullptr;
	a->_a;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值