发布于2021-05-30 20:03 阅读(1160) 评论(0) 点赞(15) 收藏(3)
c++期末复习知识点最全整理
类:具有相同属性和方法的一组对象的集合。简而言之就是一个类别,比如说牛奶、花生、酒等等就是一个是事物的类别。
注: 类是对象的类型,可以把类与int等变量类型作比较,但是不是全部都相似,类还具有方法,就是一些函数功能。
类的组成:
成员变量
就是在类里面定义的变量
成员方法
就是在类里面定义的函数(成员方法)
对象:对象是一个能够看到的实体。
注: 同样可以类比声明变量,声明一个对象,那么这个对象就是一个变量,就是真实存在的。
封装性
尽可能隐蔽对象的内部细节,对外形成一个边界(或者说一道屏障),只保留有限的对外接口使之与外部发生联系。和函数类似,把实现特定功能的代码封装进一个函数里面。
继承性
特殊类的对象拥有其一般类的全部属性与服务,称作特殊类对一般类的继承。一个类可以继承另一个类。
多态性
在继承中,不同类之间可以具有不同的数据类型或表现出不同的行为。
下面定义一个学生类
class student
{
private:
int 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(公有)。
下面是关于成员类型的简介。
注意:
形式:
对象名. 数据成员名
对象名. 成员函数名 (参数表)
形式:
对象指针名 -> 数据成员名
对象指针名 -> 成员函数名 (参数表)
注意:
1.从外部访问必须访问的是公有的数据类型,如果访问私有的数据,程序会报错
2.注意一般对象访问和指针对象的访问不一样,和结构体有点类似
下图是较为全面的总结:
构造函数:
析构函数:
代码演示:
class student
{
private:
int 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;//可以不带参数因为构造函数为重载函数
就是把一个面向对象的程序分成多个文件来写
注意:
main.cpp 文件中包含的是 类名.h 文件,不是 类名.cpp 文件,以cpp为后缀的文件不能是头文件。
包含的类的头文件需要用 “” 括起来,不是尖括号, “”是默认会查找用户定义的文件,然后再查找自带的系统文件,<>是直接从系统文件里面查找相关的文件。
条件编译:
按条件对C++程序的一部分进行编译,其它部分不编译。
条件编译的目的:
是使源代码能更迅速、更容易地进行修改,并使目标代码缩短。这样,当程序在不同系统上编译、在同一系统不同编译器上编译或进行不同目的的编译时,减少对程序语句的修改。
#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标识符了
#ifndef 标识符
//程序段1
#else
//程序段2
#endif //程序段2的结束
//意义:若该标识符没有被#define命令定义,则编译程序段1,否则编译程序段2
#if 表达式
//程序段1
#else
//程序段2
#endif
//意义:若该表达式之值非0 (为真) ,则编译程序段1,否则编译程序段2
注:
在头文件中使用“预处理器封套”,从而防止将头文件中的代码多次包含到同一个源代码文件中。由于一个类只能被定义一次,所以使用这样的预处理器指令避免重复定义的错误。
#ifndef 标识符
#define 标识符
…………
// 头文件中的内容
#endif
在头文件预处理命令#ifndef和#define中,使用大写字母,并用下划线代替圆点。
例如:tdata.h写成 TDATA_H。time.h写成TIME_H
#ifndef的方式依赖于宏名字不能冲突,这不光可以保证同一个文件不会被包含多次,也能保证内容完全相同的两个文件不会被不小心同时包含。当然,缺点就是如果不同头文件的宏名不小心“撞车”,可能就会导致头文件明明存在,编译器却硬说找不到声明的状况
#pragma once则由编译器提供保证:同一个文件不会被包含多次。注意这里所说的“同一个文件”是指物理上的一个文件,而不是指内容相同的两个文件。带来的好处是,你不必再费劲想个宏名了,当然也就不会出现宏名碰撞引发的奇怪问题。对应的缺点就是如果某个头文件有多份拷贝,本方法不能保证他们不被重复包含。当然,相比宏名碰撞引发的“找不到声明”的问题,重复包含更容易被发现并修正。
方式一由语言支持所以移植性好,方式二 可以避免名字冲突
explicit关键字只能用于修饰只有一个参数的类构造函数, 它的作用是表明该构造函数是显示的, 而非隐式的, 跟它相对应的另一个关键字是implicit, 意思是隐藏的,类构造函数默认情况下即声明为implicit(隐式).
#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黑洞网
任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任
昵称:
评论内容:(最多支持255个字符)
---无人问津也好,技不如人也罢,你都要试着安静下来,去做自己该做的事,而不是让内心的烦躁、焦虑,坏掉你本来就不多的热情和定力
Copyright © 2018-2021 php黑洞网 All Rights Reserved 版权所有,并保留所有权利。 京ICP备18063182号-4
投诉与举报,广告合作请联系vgs_info@163.com或QQ3083709327
免责声明:网站文章均由用户上传,仅供读者学习交流使用,禁止用做商业用途。若文章涉及色情,反动,侵权等违法信息,请向我们举报,一经核实我们会立即删除!