c++面向对象编程
一、c++简介
编程思想就是解决当前的世界问题的建模,当前比较流行的编程思想主要有面向过程式编程(pop)和面向对象编程(oop)
1、面向过程编程
关注的是怎么做的问题,主要思路是将数据与函数按照指向性的逻辑顺序组织在一起,数据与函数分开考虑
特点:注重步骤与过程,不注重职责分工
2、面向对象编程
关注的是谁来做的问题
相比于面向过程来说,面向对象是更大的封装,首相确定的职责(要做的事情(方法)),根据职责确定不同的对象,在对象内部 封装不同的方法(多个)并实现它,最后按照业务逻辑让不同的对象调用不同的方法
特点:注重对象和责任,不同的对象承担不同的责任;比较适合应对复杂的需求变化的目的,已维护,易复用,易扩展,但是缺点是性能比面向过程低
如何选择?
在编写规模小的程序时,使用面向过程编程,对于中等和大型项目来说,面向对象将给代码的编码和维护带来优势
二、面向对象相关概念
1、什么是类
类是具有相同特征的(数据元素)和行为(功能)的对象的抽象,不能直接使用
特征被称为属性(是对事物的某种特性的抽象秒速,比如年龄、性别)
行为被称为方法(表示对象的行为(类中定义的函数,用来给类添加功能))
2、对象
客观世界中的任何事物都可以看做一个对象(object),对象是由类创建出来的一个具体存在,可以直接使用
由哪一个类创建出来的对象,就拥有在哪一个类中定义的属性和方法
对象就相当于用图纸制造出来的汽车
3、类和对象的关系
类是模版,对象是根据类这个模版创建出来的,程序开发中应该先有类,再有对象
类只有一个,而对象可以有很多个,不同的对象之间的属性可能会各部相同
类定义了什么属性和方法,对象中就有什么属性和方法
4、如何设计类
在程序开发中,要设计一个类,通常需要满足一下三个因素:
1、类名:这类事物的名字,满足大驼峰命名法,比如CapWords
2、属性:这类事物具有什么样的特征
3、方法:这类事物具有什么样的行为
如何确定类名?
名词提炼法,分析整个业务流程,出现的名词,通常就是找到的类
5、面向对象的三大特征(重点)
封装
就是抽象得到的数据和行为(或功能)相结合,形成一个有机的整体,也就是将数据和操作数据的源代码进行邮寄的结合,形成“类”,其中数据和函数都是类的成员
继承
继承性主要描述类与类之间的关系,通过继承,乐意在无需重新编写原有类的情况下,对原有类到的功能进行扩展
多态
一个类中的属性和方法被其他类继承后,对象早调用属性或方法所表现出来的不同行为,多态一般是发生在子类和父类之间
三、类类型的定义
#include <iostream>
#include <string>
#include<stdlib.h>
#include<string.h>
using namespace std;
//在C++中,给用户提供两种自定义数据类型的手段:结构体+类类型
class stu //类类型-----类类型就是C语言中结构体的加强版(主要的扩展点:允许在内部存放函数成员,可以对内部的成员设置访问权限)
{
public: //设置成员是否向外界暴露, 其实就用用来设置访问权限:public ,private,protectedstring name; //name id 它们是数据成员--用来描述事物的属性int id;void print() //叫成员函数或方法 ----描述事物的行为{cout << name << endl;}
private:int age;};int main()
{/* struct stu s1;s1.name = "laoguo";s1.age = 12;s1.id = 33;*/return 0;
}
#include <iostream>
#include <string>
#include<stdlib.h>
#include<string.h>
using namespace std;//一个类中主要包含数据成员列表和函数成员列表,一个类可以只有数据成员,也可以只有函数成员,也可以两者都没有(空类)
class stu //class用来表示当前的类属于类类型,类名的命名要符号标识符的规则,可以采用驼峰法来命名,要做到见名知意
{//在一个类中可以写多个访问权限修饰符
public: //访问权限修饰符 有三个 public protected private, 使用格式:权限修饰符 :string name; //定义类时,如果省略访问权限修饰符,则任务该成员是私有的int id;void print() {cout << name << endl;}
private: //访问修饰符的修饰访问:是从当前的位置开始到下一个修饰符开始或类结束为止,这个就是它的修饰范围int age;public://同一个访问修饰符可以在类中出现多次,但是一般不推荐,建议 先写public ,protected ,最后privateint ff;};int main()
{/* struct stu s1;s1.name = "laoguo";s1.age = 12;s1.id = 33;*/return 0;
}
四、对象的定义
#include <iostream>
#include <string>
#include<stdlib.h>
#include<string.h>
using namespace std;class stu
{
public:string name;int age;/* void print(){cout << name << age << endl;}*/virtual void print1() //类类型中的成员好结构图一样,也讲究内存对齐{cout << name << age << endl;}virtual void print2()//一个类中不管存在多少个虚函数,只会多占用一个指针大小的内存空间{cout << name << age << endl;}};int main()
{class stu s1;//类对象的定义格式:[ class ] 类名 对象名;class可有可无stu s2;//一个类可以创建多个类对象,这些对象之间的内存空间是独立的cout << sizeof(s2) << endl;//32--- 一般来说,类中的成员函数不占用该类所创建对象的内存空间,意味着成员函数在内存中只存一份,供给类的所有对象所共享return 0;
}
#include <iostream>
#include <string>
#include<stdlib.h>
#include<string.h>
using namespace std;//class stu
//{
//public:
// int a;
// char b;
//
//
//
//
//};//class stu1
//{
//public:
// int a;
// //char b;
// static int c;
//
//
//
//};class stu2
{};int main()
{//cout << sizeof(stu) << endl;//8//cout << sizeof(stu1) << endl;//4.在C++中静态成员属于类 不属于对象cout << sizeof(stu2) << endl;//1.//一个类可以创建多个对象,为了在内存中区分不同的对象,因此需要给一个空类分配一个字节return 0;
}
五、类的成员函数与数据成员
#include <iostream>
#include <string>
#include<stdlib.h>
#include<string.h>
using namespace std;//关于C++ 数据成员 和函数成员如何定义class stu //类=数据成员+函数成员
{
public:string name;//数据成员= [const/static ]数据类型+成员名;int age;//定义成员函数有两种方式,一种方式 :直接在类内定义函数void print()//将函数定义在类内,一般不叫函数 叫成员函数或方法{cout << name << age << endl;}void mytest();//方式2:类内声明,类外实现 较常用 ,因为在类中定义的成员函数系统会会认为它是内置函数private:int id;};
//类外定义成员函数的格式: 返回类型 类名::成员函数名(形参列表){函数体}
void stu::mytest()// :: 作用域限定符
{cout << name << age <<id<< endl;//类中的成员函数 可以访问类中的私有成员 公有成员,受保护成员}int main()
{stu s1;s1.name = "sdf"; //对类中数据成员的初始化可以延用结构图的方式,采用逐成员进行初始化//s1.id = 100;不可以行,在类外初始化数据成员 有一个大的前提 是成员是公有的,//对于类中非公有成员,需要通过构造函数来对其初始化(较常用)。return 0;
}
五、引用中的成员
#include <iostream>
#include <string>
#include<stdlib.h>
#include<string.h>
using namespace std;class stu
{
public:string name;int age;void print()//将函数定义在类内,一般不叫函数 叫成员函数或方法{cout << name << age << endl;//类内访问数据成员: 直接写数据成员的名字}void mytest();/* int test() 类外可以通过类内的公共函数来间接获得类中非公有成员{return id;}*/private:int id;};void stu::mytest()// 在类中的成员函数内,可以调用类中其他数据成员和函数成员
{cout << name << age <<id<< endl;//类中的成员函数 可以访问类中的私有成员 公有成员,受保护成员print();
}int main()
{stu s1;s1.name = "sdf"; //访问类中数据成员的语法格式: 对象名.数据成员名;s1.age = 12;//如果对未初始化的数据成员进行访问,内部可能是随机值。//s1.print();//访问类中成员函数的语法格式对象名.成员函数名(【实参列表】);//通过对象名访问类中的成员,主要针对的是类中的公有成员(被public修饰的成员)s1.mytest();return 0;
}