程序员成长之旅——C++面向对象

程序员成长之旅——C++面向对象


描述面向对象技术的基本概念
面向对象是指按人们认识的客观世界的系统思维方式,采用基于对象(实体)的概念建立模型,模拟客观世界分析、设计、实现软件的方法,包括类、对象、消息以及类的特性等方面的内容。
class和struct的区别
(1)C语言的struct和C++的class的区别:struct只是作为一种复杂的数据类型定义,不能用于面向对象编程。(也就是struct只能定义成员变量不能定义成员函数)
(2)C++中的struct和class的区别:对于成员访问权限以及继承方式,class默认是private的,而struct默认是public的。class还可以用于表示模板类型,struct则不行。
C++类的声明
在调用不带参数的构造函数的时候不需要加小括号。
类成员的初始化
初始化列表的初始化顺序和变量声明的顺序一致。
与全局对象相比,使用静态数据成员有什么优势
(1)静态数据成员没有进入程序的全局名字空间,因此不存在程序中其他全局名字冲突的可能性。
(2)使用静态数据成员可以隐藏信息。因为静态成员可以是private成员,而全局对象不能。
什么情况只能用初始化列表,而不能用赋值
(1)对于const类型成员变量,由于不能被赋值,因此只能用初始化列表。
(2)类的构造函数需要调用基类的构造函数的时候。
main函数执行前还会执行什么代码?

#include<iostream>
using namespace std;

class Test
{
public:
	Test()//构造函数
	{
		cout << "constructor of test" << endl;
	}
};
Test a; //全局变量
int main()
{
	cout << "main() start" << endl;
	Test b; //局部变量
	return 0;
}

程序的输出结果

constructor of Test
main() start
constructor of Test

可看出来,全局对象的构造函数在main函数之前执行。
C++中空类默认会产生哪些类成员函数
C++的空类中,默认会产生默认构造函数、析构函数、拷贝构造函数、赋值函数、取值运算。
构造函数和析构函数是否可以被重载
构造函数可以,因为构造函数可以有多个,带参数;
析构函数不可以被重载,因为析构函数只能有一个,且不能带参数。
C++中虚析构函数的作用是什么
防止基类的指针new一个派生类的对象的时候,析构基类的指针的时候只进行基类的析构函数调用,而不调用派生类的析构函数,从而造成内存泄漏,因此只要有一个类被用来作为基类的时候,就会将其写成虚函数。
拷贝构造函数是什么?什么是深拷贝什么是浅拷贝
拷贝构造函数时一种特殊的构造函数,它由编译器调用来完成一些基于同一类的其它对象的构件及初始化。
浅拷贝是指让新旧两个对象指向同一个外部的内容,而深拷贝是指为新对象制作了外部对象的独立赋值。
编译器和默认的拷贝构造函数
如果用户没有自定义拷贝构造函数,并且在代码中使用到了它,那么编译器就会生成默认的拷贝构造函数;但如果用户定义了拷贝构造函数,那么编译器就不会生成拷贝构造函数;
反正记住一点,只要代码中用到了,用户没有自定义拷贝构造函数,都会生成默认的拷贝构造函数。
拷贝构造函数和赋值函数有什么区别?
最大的区别就是拷贝构造函数是通过已初始化的对象去初始化未初始化的对象,

class A
A a;
A b = a;
A b(a);

而赋值函数是用以初始化的对象去覆盖也以及初始化的对象。

class A;
A a;
A b;
a = b;

编写类string的构造函数、析构函数和赋值函数

#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
//深拷贝
namespace lpf
{
	class String
	{
	public:
		String(const char* s = "")
		{
			if (nullptr == s)
				s = " ";

			_str = new char[strlen(s) + 1];
			strcpy(_str, s);
		}
		String(const String& s)
			:_str(new char[strlen(s._str) + 1])
		{
			strcpy(_str, s._str);
		}
		String& operator=(const String& s)
		{
			String strTemp(s._str);
			swap(_str, strTemp._str);
			return *this;
		}
		~String()
		{
			if (_str)
			{
				delete[] _str;
				_str = nullptr;
			}
		}
	private:
		char* _str;
	};
}

int main()
{
	lpf::String s1("hello");
	lpf::String s2(s1);
	lpf::String s3;
	s3 = s1;
	return 0;
}

什么是临时对象?临时对象在什么时候产生
首先我们要清楚,临时对象和局部变量是完全不同的两种概念,简单的说。临时对象,是在做参数和返回值的时候,通过值传递产生的,一般我们可以用引用解决这个问题。
为什么C语言不支持函数重载而C++能支持
首先要清楚函数重载的意思就是函数名相同,但是参数不同的同类函数,和返回值相不相同没有关系。
而C++支持函数重载的最大原因就是编译器对其重载函数进行了处理,它包含了原函数名,参数类型,返回类型的信息,这样就可以区分它们,而C没有进行编译器符号的处理,只是通过函数名区分,因此C不可以。
重载和重写(覆写)有什么区别
1.重载是函数名相同,参数不同,返回值不限制的一类函数;而重写是首先是虚函数或者抽象方法才可以重写,函数名,参数,返回值均相同的一类函数。
2.重载是一种语法规则,它是在编译阶段完成,不属于面向对象的编程,而重写是由运行阶段决定的,是面向对象编程的重要特性。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

从零出发——

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值