本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长

+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

2024-11(1)

c++期末知识点快速复习,最全整理(二)

发布于2021-05-30 20:03     阅读(1254)     评论(0)     点赞(15)     收藏(3)


c++期末复习知识点最全整理

二、类与对象简介

1.类与对象的描述

  • 类:具有相同属性和方法的一组对象的集合。简而言之就是一个类别,比如说牛奶、花生、酒等等就是一个是事物的类别。

    注: 类是对象的类型,可以把类与int等变量类型作比较,但是不是全部都相似,类还具有方法,就是一些函数功能。

    • 类的组成:

      • 成员变量

        就是在类里面定义的变量

      • 成员方法

        就是在类里面定义的函数(成员方法)

  • 对象:对象是一个能够看到的实体。

    注: 同样可以类比声明变量,声明一个对象,那么这个对象就是一个变量,就是真实存在的。

2.类的特性

  • 封装性

    尽可能隐蔽对象的内部细节,对外形成一个边界(或者说一道屏障),只保留有限的对外接口使之与外部发生联系。和函数类似,把实现特定功能的代码封装进一个函数里面。

  • 继承性

    特殊类的对象拥有其一般类的全部属性与服务,称作特殊类对一般类的继承。一个类可以继承另一个类。

  • 多态性

    在继承中,不同类之间可以具有不同的数据类型或表现出不同的行为。

3.类的定义及成员属性

下面定义一个学生类

class student
{
privateint id;//学号
	char name[20];
	int age;
public:
	void SetData(int a,char s[],int b)
	{
		id = a;
        name = s;
        age = b;
	}
}a,b,c;//同时声明三个student对象a,b,c
student d,e; //声明两个student对象d,e

注: 和定义结构体非常类似,可以与结构体相互比较。

以上代码定义了一个学生类,有三个成员变量,分别是id,name,age,可以看到他们的属性为private(私有)。

还有一个成员方法SetData()用来设置成员变量的值,它的属性是public(公有)。

下面是关于成员类型的简介。

在这里插入图片描述
在这里插入图片描述

注意:

  • 类内的成员变量可以相互调用,无论属性是私有还是公有。就好似一家子一样,私有只是对外部而言的。
  • 如果未加说明,类中成员默认的访问权限是private,即私有的。

4.对象成员的访问

  • 访问一般对象

形式:

对象名. 数据成员名
对象名. 成员函数名 (参数表)

  • 访问指针对象

形式:

对象指针名 -> 数据成员名
对象指针名 -> 成员函数名 (参数表)

注意:

1.从外部访问必须访问的是公有的数据类型,如果访问私有的数据,程序会报错

2.注意一般对象访问指针对象的访问不一样,和结构体有点类似

下图是较为全面的总结:

在这里插入图片描述

在这里插入图片描述

5.构造函数和析构函数

构造函数:

  • 构造函数的作用是在对象被创建时使用特定的值构造对象,或者说将对象初始化为一个特定的状态。
  • 在对象创建时由系统自动调用。
  • 如果程序中未声明,则系统自动产生出一个默认形式的构造函数
  • 构造函数除了不存在返回值、不可通过对象来调用这样一些特殊之处外,其它方面与普通公有成员函数完全一样。
  • 允许为内联函数、重载函数、带默认形参值的函数

析构函数:

  • 析构函数的作用为在对象作用域的末尾释放对象的空间
  • 在对象空间释放时自动调用
  • 析构函数也不存在返回值,不可以通过对象来自动调用

代码演示:

class student
{
privateint id;//学号
	char name[20];
	int age;
public:
	student()
	{
		cout<<"不带参数的构造函数\n";
	}
	student(int a,char s[],int b)
	{//带参数的构造函数,默认在创建时调用,直接对成员变量进行赋值
		id = a;
		name = s;
		age = b;
	}
	void SetData(int a,char s[],int b)
	{
		id = a;
        name = s;
        age = b;
	}
	~student()
	{
		cout<<"析构函数\n";
	}
};
student s1(2,"wang",14),s2;//可以不带参数因为构造函数为重载函数

6.接口与实现分离

就是把一个面向对象的程序分成多个文件来写

  • 类名.cpp文件
    • 书写类中成员函数的代码(对代码进行功能扩充)
  • main.cpp文件
    • 主文件,声明类进行测试
    • 头文件需要包含 类名.h 文件
  • 类名.h 文件
    • 书写类的主体,其中的函数只声明就行,因为代码主体是在 类名.cpp文件中写的

注意:

  • main.cpp 文件中包含的是 类名.h 文件,不是 类名.cpp 文件,以cpp为后缀的文件不能是头文件。

  • 包含的类的头文件需要用 “” 括起来,不是尖括号, “”是默认会查找用户定义的文件,然后再查找自带的系统文件,<>是直接从系统文件里面查找相关的文件。

7.条件编译

  • 条件编译:

    按条件对C++程序的一部分进行编译,其它部分不编译。

  • 条件编译的目的:

    是使源代码能更迅速、更容易地进行修改,并使目标代码缩短。这样,当程序在不同系统上编译、在同一系统不同编译器上编译或进行不同目的的编译时,减少对程序语句的修改。

7.1. 形式1

#ifdef 标识符     
//程序段1
#else  
//程序段2
#endif
//意义:若该标识符已被#define命令定义,则编译程序段1,否则编译程序段2
#define DEBUG
#ifdef DEBUG
freopen("1.txt","r",stdin);//程序段1
#else
cout<<"行码棋\n";//程序段2
#endif  //表示程序段2的结束

//上述代码会运行程序段1,因为定义过DEBUG标识符了

7.2.形式2

#ifndef 标识符
//程序段1
#else 
//程序段2
#endif //程序段2的结束
//意义:若该标识符没有被#define命令定义,则编译程序段1,否则编译程序段2

7.3. 形式3

#if  表达式
//程序段1
#else 
//程序段2
#endif
//意义:若该表达式之值非0 (为真) ,则编译程序段1,否则编译程序段2

注:

  • #else 程序段2 这部分可以没有。
  • 其中#ifdef等价于#if defined
  • #ifndef等价于#if !defined

7.4.应用:预处理器封套

在头文件中使用“预处理器封套”,从而防止将头文件中的代码多次包含到同一个源代码文件中。由于一个类只能被定义一次,所以使用这样的预处理器指令避免重复定义的错误。

#ifndef	标识符
#define	标识符
…………
// 头文件中的内容
#endif

  • 在头文件预处理命令#ifndef和#define中,使用大写字母,并用下划线代替圆点。

    例如:tdata.h写成 TDATA_H。time.h写成TIME_H

  • #ifndef的方式依赖于宏名字不能冲突,这不光可以保证同一个文件不会被包含多次,也能保证内容完全相同的两个文件不会被不小心同时包含。当然,缺点就是如果不同头文件的宏名不小心“撞车”,可能就会导致头文件明明存在,编译器却硬说找不到声明的状况

  • #pragma once则由编译器提供保证:同一个文件不会被包含多次。注意这里所说的“同一个文件”是指物理上的一个文件,而不是指内容相同的两个文件。带来的好处是,你不必再费劲想个宏名了,当然也就不会出现宏名碰撞引发的奇怪问题。对应的缺点就是如果某个头文件有多份拷贝,本方法不能保证他们不被重复包含。当然,相比宏名碰撞引发的“找不到声明”的问题,重复包含更容易被发现并修正。

  • 方式一由语言支持所以移植性好,方式二 可以避免名字冲突

8.explicit关键字

8.1.介绍

explicit关键字只能用于修饰只有一个参数的类构造函数, 它的作用是表明该构造函数是显示的, 而非隐式的, 跟它相对应的另一个关键字是implicit, 意思是隐藏的,类构造函数默认情况下即声明为implicit(隐式).

8.2. 作用

  • 注意:必须是只有一个参数才会出现该关键字
#include<bits/stdc++.h>
using namespace std;
class stu
{
private:
	int id;
public:
	stu(int i)
	{
		id = i;	
	}	
	void print()
	{
		cout<<"id = "<<id<<'\n';
	}
};

int main()
{
	stu a = 10; //10隐式转换为参数
	a.print();
	return 0;
 } 

结果:

id = 10

分析:

当只有一个参数时,stu a = 10;直接赋值了,其实是创建了stu的对象a,然后10自动隐式转化为传进去的参数,所以能够运行成功

加上explicit关键字后

#include<bits/stdc++.h>
using namespace std;
class stu
{
private:
	int id;
public:
	explicit stu(int i)
	{
		id = i;	
	}	
	void print()
	{
		cout<<"id = "<<id<<'\n';
	}
};

int main()
{
	stu a = 10;
	a.print();
	return 0;
 } 

显示报错,因为加上关键字要求必须是显式的转化,不能隐式转化

原文链接:https://blog.csdn.net/qq_50285142/article/details/117381481



所属网站分类: 技术文章 > 博客

作者:再拍我就焖面

链接:http://www.phpheidong.com/blog/article/86830/7b46b83daeedbfe18f4d/

来源:php黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

15 0
收藏该文
已收藏

评论内容:(最多支持255个字符)