C++ 基础

简介: C++ 基础

一、友元函数

可以访问私有

#include <iostream>//包含了大部分的头文件
using namespace std;//命名空间相当于全局声明std 输出流
class Car //类名
{
    public:  //公有
    friend void Print(Car *sp);//修饰成为友元函数
    void h(int yy)//改变私有变量
    {
    number=yy;
    }
    private://私有数据成员和成员函数
    int H=170;ll身高
    int number=1000;//身价
};
/**
* @brief Print
* param sp对象传参时必须传这个类型的对象
*/
void Print(Car *sp)l/公共访问私有变量
{
   cout<<"身高"<<sp->H<<"CM"<<endl;
   cout<<"身价"<< sp->number <<"万"<<endl;
}
int main()
{
   Car *Pt =new Car(  ;Pt->h( 100000000);Print(Pt);
}
//类的继承,函数多态,函数重载

二、类的嵌套

#include <iostream>//头文件
#include <string.h>
using namespace std;//命名空间
class Animal //动物类型
{
  public:  //公有的
  int a=1000;
  class Dog//
  {
      public:
      int b=999;
  };
};
int main()
{
    Animal sp;
    cout <<sp.a<<endl;
    Animal : :Dog st;//访问Dog必须加上作用域 否则禁止访问
    st.b;//访问嵌套的成员
    cout <<st.b<<endl;
    return 0;
}

带参数的嵌套

#include <iostream>
#include <string>
using namespace std;
class Boy
{
    private :
    public:
      Boy ();
       class Human
       {
        private:
        int height;
        int weight;
        public:
        Human(int height,int weight); //声明构造函数
        ~Human( );
        };
};
Boy : : Human: : Human(int height , int weight) :height(height),weight(weight)
{
   cout << height ;
}
Boy : : Human : : ~Human()//析构函数
{
}
int main(void)
{
     //Human a;  //Human类作为Boy类下的嵌套类,不能只用该类的类名创建对象
    Boy :: Human a(10,199);//使用类名::嵌套类名对象
来创建嵌套类的对象
}

三、命名空间

封装变量函数

#include <iostream>
#include <string>
using namespace std;//没有命名空间需要加上输出流的作用域
//定义带标签的全局定义
namespace Usart{
   int bound=115200;
   int datalen;
   int TXD;
   int RXD;
   void fun()
   {
     std: : cout<<"12345"<<std : :endl;
   }
}
using namespace Usart; //声明
int main(void)
{
    std:: cout<<Usart: : bound<<std : :endl;
    Usart:: fun();
}
//inline 内联函数自己写的函数有时候会重复嵌套使用,会造成多次重复执行和编译

四、继承和多继承

例子:

换代叠加功能,重写优化

单继承格式:

class 派生类名∶派生方式 基类名

{ // 派生类新增的数据成员和成员函数 } ;

多继承:

class 派生类名∶派生方式 基类A名,派生方式 基类B名,

{ // 派生类新增的数据成员和成员函数 } ;

派生出来的类就可以使用公共函数。。。。。

#include <iostream>//包含了大部分的头文件
using namespace std; //命名空间相当于全局声明std输出流
class Car //基类父类
{
     public:l//公有
     void Cou()
     {
     cout<<"基类函数:"<<"4个轮子"<<endl;
     } 
     private: //私有数据成员和成员函数
     int x=100;
};
class A //基类父类
{
     public: //公有
     void couA() 
     {
        cout<<"A类: "<<"外壳"<<endl;}
     };
//子类派生类
class Car_v10 :public car,public A
{
     public: //公有
     void couV10()
     {
         cout<<"子类函数;"<<"4个轮子+发动机"<<endl;
     }
      private: //私有数据成员和成员函数
};
int main()
{
   Car_v10 *sp= new Car_v10();
   sp->Cou();
   sp->Couv10();
   sp->CouA();
}

私有:

1、私有派生

(1)私有派生类对基类成员的访问

由私有派生得到的派生类,对它的基类的公有成员只能是私有继承,也就是说基类的所有公有成员都只能成为私有派生的私有成员,这些私有成员能够被派生的成员函数访问,但是基类私有成员不能被派生类成员函数访问。

五、函数重载

<< >> 在C语言叫左移右移 在C++可以是输入输出也可以是左移右移

意思就是说一个东西多种功能 ,在C语言函数是不能重名的

函数重载:函数名一样 参数根据形参而选择函数使用,函数重载一次后在派生类内不要在次重载

#include <iostream>//包含了大部分的头文件
using namespace std; //命名空间相当于全局声明std 输出流
class Car //基类父类
{
   public://公有
   void Cou()
   {
      cout<<"无参数"<<endl;
   }
   void Cou(int a)
   {
      cout<<"输出整型"<<a<<endl;
   }
void Cou(string a)
{
  cout<<"字符串"<<a<<endl;
}
private: //私有数据成员和成员函数
};
//子类派生类
class Car_v10 :public Car
{
   public: //公有
   void Couv10()
   {
      cout<<"子类函数: "<<"4个轮子+发动机"<<endl;
   }
   private: //私有数据成员和成员函数
};
int main()
{
  Car_v10*sp= new Car_v10();
  sp->Cou();
  sp->Cou( 10);
  sp->Cou("你好");
  sp->CouV10() ;
}

六、函数多态

函数多态作用,调用不同对象对同意函数操作会输出不同结果,为了后续重写,抽象函数

#include <iostream>//包含了大部分的头文件
using namespace std;//命名空间相当于全局声明std 输出流
class Person {
public:
//虚函数
  virtual void BuyTicket(){/*空*/} 
protected:
  string _name;
};
class student : public Person {
public:
//虚函数+函数名/参数/返回值-》重写/覆盖
  virtual void BuyTicket()
  {
      cout <<_name << "student:买票-半价50 ¥" <<endl;
  }
};
int main()
{
      Person *sp=new Person();
      sp->BuyTicket();
      Student * pt =new Student();
      pt->BuyTicket();
}

通过不用对象执行不同的虚函数

#include <iostream>/( 包含了大部分的头文件
using namespace std;//命名空间相当于全局声明std输出流
class Person {
public:
//虚函数
virtual void BuyTicket()
{
   cout <<_name <<"Person:买票-全价100¥" <<endl;
}
protected :
string _name;
};
class Student : public Person {
public:
   //虚函数+函数名/参数/返回值-》重写/覆盖
   virtual void BuyTicket()
   {
      cout <<_name << "student:买票-半价50 ¥" << endl;
   }
};
int main()
{
     Person *sp=new Person();
     sp->BuyTicket();
     Student * pt =new student();
     pt->BuyTicket();
}

重写析构函数

#include <iostream>//包含了大部分的头文件
using namespace std;//命名空间相当于全局声明std 输出流
class Person {
      public:
      virtual ~Person() {cout <<"~Person()" <<endl;}
};
class Student : public Person {
     public:
     virtual ~Student() { cout <<"~Student()" <<endl; }
};
int main()
{
     Person* p1 = new Person ;
     Person* p2 = new Student;
     delete p1;
     delete p2 ;
     return 0;
}

防止重写虚函数

#include <iostream>//包含了大部分的头文件
using namespace std;//命名空间相当于全局声明std输出流
class Person {
public:
    //虚函数
    virtual void BuyTicket() final //声明接口函数不被重写
    {
       cout <<_name << "Person:买票-全价100¥" <<endl;
    }
   protected :
   string _name;
};
class student : public Person {
public:
int main()
{
   Person *sp=new Person();
   sp->BuyTicket();
   student * pt =new student();
   pt->BuyTicket();
}

跟C语言一样:

#include "stdio.h"

int main()

{

 const int a;//只读

a = 100;

}

七、函数模板

函数模板跟函数重载类似,区别在于函数模板的类型不确定,还可以强制转换类型:-----泛型编程

template <typename T>
T Myswap(const T a,const T b)
{
   T sp = a+b;
   return sp;
}
int mian()
{
   int a = 90 ;
   int ss = 7;
   string str1 = " 你好!";
   string str2 = " 中国";
   cout<< Myswap< char> (a,ss) << endl; //传入参数强转为char
   cout<< Myswap(a,ss)<<endl;  //默认为int类型
   cout<< Myswap(str1,str2)<<endl; //默认额字符串类型
}

String类的简单使用:

#include <iostream>
using namespace std ;
int main()
{
   int a=90;
   int ss=7;
   string str1="一>你好! ";
   string str2="中国";
   cout << a+ss<<endl;
   cout <<str1+str2<<endl;
   if("中国"==str2)
   {
     cout <<"比较"<<endl;
   }
  str1+="很好";//拼接功能
  cout <<"拼接"<<str1<<endl;
  cout<<"跟数组一样单个元素访问"<<str1.at(o)<<endl;l
  str1.append ( ">>>>") ;
  cout <<"插入"<<str1<<endl ;
  str1.clear ( ) ;
  cout <<"清空:"<<str1<<endl;
}

八、带参数的构造函数继承

#include <iostream>
using namespace std;
class A
{
  public:A(int s){
  cout<< "s="<<s<<endl;
}
};
classB: public A
{
 public :
 B(int x):A(x) //A(x)传什么值给Xx就把值传给A的的构造函数
{
 cout<< "X"<<x;
}
};
int main()
{
   A *sp =new A(88) ;
   B*pt =new B( 100 ) ;
}

另有给私有变量传参

#inc1ude <iostream>//头文件
#inc1ude <string.h>
using namespace std;//命名空间
class Anima1 //动物类型
{
  pub1ic://公有的
  Anima1(int x) :a(x)//直传X的值给acl{J
};
void prin(void) 
{
  cout <<a ; 
}
private://私有-int a=999;//私有的-
(
};
int main()
{
   Anima1 *Dog = new Anima1(100) ; //new形式创建一个对象纠Dog->prin( ; 
   delete Dog;/ /释放对象return 0; 
}
相关文章
|
3月前
|
传感器 编解码 C++
C++视频基础
C++视频基础
|
7月前
|
数据安全/隐私保护
基础练习-6
基础练习-6
43 0
|
9月前
|
安全 数据安全/隐私保护
社工基础
这次带来的是 社工的心理学的欺骗思路 社工,全程为社会工程学,起源于凯文·米特尼克的《反欺骗的艺术》,
|
存储 自然语言处理 安全
C++基础
学习C++的基础语法(建立在已有的C语言基础上)
C++基础
|
JavaScript 前端开发 API
Typesctipt基础(二)
Typesctipt基础(二)
107 0
|
存储 Java 编译器
C/C++ - 基础篇(下)
C/C++ - 基础篇(下)
215 0
C/C++ - 基础篇(下)
|
图形学 Windows
GDI+基础
GDI+的核心是 Graphics 对象,Graphics 类定义了绘制和填充图形对象的方法和属性。Graphics 类的属性(字段)很多,具体可参见 MSDN。Graphics 类的方法分为三类:绘制、填充及其他。
680 0
GDI+基础
|
Web App开发 JavaScript 前端开发