C语言到C++入门

久未见 提交于 2020-01-12 21:58:49

C语言到C++入门

前言

很早以前就学了c语言,后来也学习了Java语言,突然想看看c++语言。也没想学的多深,毕竟C++是公认的难、不过我想有其他语言基础,学习一下基本语法应该相对简单的。

环境

g++

c++17

1、准备

C++ 是 C 的一个超集,事实上,任何合法的 C 程序都是合法的 C++ 程序。

经常看到的一句话是 c++就是 c with class

c++的文件扩展名是cpp.

2、结构

一个c++的语言结构如下:


  1. 头文件,中含有c++的标准输入输出流

  2. 命名空间、用于管理模块,一个文件中可以有多个命名空间

#include <iostream>//头文件
using namespace std;//命名空间

void add(int *x,int y);//函数声明

int main()
{
   
    int x=0;
    add(&x,10);

    cout<<x<<" end"<<endl;//标准输出流

    string s;//字符串

    cout<<"input string"<<endl;
    cin>>s;//标准输入

    cout<<"out  "<<s;//换行
}

void add(int *x,int y){//函数
    *x=*x+y;
}

这个文件使用了 iostream文件下的std命名空间。cout\cin都是此文件std下的功能。>>箭头是流操作符。

3、命名空间

命名空间的使用即 spaceName::xxx

如果使用using关键字后,可以直接使用空间内的功能。

#include <iostream>
using namespace std;
#include<stdio.h>//c头文件

namespace ns_1{//命名空间1
    
    const string ns="namespace_1";
    void out(){
        cout<<ns<<endl;
        printf("ns_1\n");//c的格式化输出
    }
}

namespace ns_2{//命名空间2
    
    const string ns="namespace_2";
    void out(){
        cout<<ns<<endl;
    }
}


using namespace ns_1;//using使用命名空间

int main()
{
    out();//ns_1的out()
    ns_2::out();//ns_2的out()
    
}

4、引用

引用很容易与指针混淆,它们之间有三个主要的不同:

  • 不存在空引用。引用必须连接到一块合法的内存。
  • 一旦引用被初始化为一个对象,就不能被指向到另一个对象。指针可以在任何时候指向到另一个对象。
  • 引用必须在创建时被初始化。指针可以在任何时间被初始化。
    int x=10;
    int y=x;
    
    cout<<"x: "<<x<<"  y:  "<<y<<endl;
    y=7;
    cout<<"x: "<<x<<"  y:  "<<y<<endl;

    int&z=x;//引用
    cout<<"x: "<<x<<"  z:  "<<z<<endl;

    z=1;//修改引用
    cout<<"x: "<<x<<"  z:  "<<z<<endl;


x: 10  y:  10
x: 10  y:  7
x: 10  z:  10
x: 1  z:  1

5、面向对象

c++支持面向对象,那么就有类的概念。

C++的类由成员变量、静态成员变量、成员函数、构造函数、析构函数、静态函数、友元函数、内联函数等构成。

类、构造、析构、成员函数、变量及修饰符

使用class关键字定义对象,使用public \private\protected关键字管理成员可见性。

#include<iostream>
using namespace std;

class Animal{
    public:
        int id;
        int age;
        string name;
    
        Animal(){//无参构造
            cout<<"init  "<<endl;
        }

        ~Animal();//析构函数,具体功能在外部实现

        void info(){
            cout<<id<<" "<<age<<" "<<name<<endl;
        }

        void sayHi();//成员函数声明,函数体在外部

    
};


Animal::~Animal(){//析构函数
    cout<<" destory  end====="<<endl;
}

void Animal::sayHi(){//外部实现函数功能
    cout<<"  hello "+name<<endl;

}



int main(){
    Animal a;//声明对象
    a.id=10010;//公开成员可直接访问
    a.name="dog";
    a.info();

    cout<<a.id;
    
    a.sayHi();
}

//this是类中的指针,指向当前对象、不能指向静态成员
静态成员
#include<iostream>
using namespace std;



class Animal{
    public:
        int id;
        int age;
        string name;

        Animal(double height,double weight){//含参构造函数
            this->height=height;
            this->weight=weight;
            cout<<"init  end======="<<endl;
        }
 
        void sayHi();//成员函数

        static string data;//成员变量

        static void getData(){//静态成员函数
            cout<<" get data ====="<<endl;
        }
    
    private:
        double height;
        double weight;

        void show_HW(){//私有函数只能在类内部实现
            cout<<"Animal's h: "<<height<<" w: "<<weight<<endl;
        }


};


Animal::~Animal(){//析构函数
    cout<<" destory  end====="<<endl;
}

void Animal::sayHi(){//外部实现函数功能
    cout<<"  hello "+name<<endl;
    this->show_HW();
}


string Animal::data="this is data";//给静态成员赋值

int main(){
    Animal a(120.5,92.34);//声明对象
    a.id=10010;
    a.name="dog";
    a.info();

    cout<<a.id;
    
    a.sayHi();

    Animal::getData();//调用静态函数

}

6、继承

c++支持多继承、虚继承等。

基本继承形式如下:

class derived-class: access-specifier base-class

如:
class Cat :public Animal{

    
};

继承权限如下:
公有继承(public):当一个类派生自公有基类时,基类的公有成员也是派生类的公有成员,基类的保护成员也是派生类的保护成员,基类的私有成员不能直接被派生类访问,但是可以通过调用基类的公有和保护成员来访问。
保护继承(protected): 当一个类派生自保护基类时,基类的公有和保护成员将成为派生类的保护成员。
私有继承(private):当一个类派生自私有基类时,基类的公有和保护成员将成为派生类的私有成员。

子类可以继承父类非函数,但父类的构造函数和析构函数不能被继承。

若想调用父类的构造函数,child_init():base_init(),析构函数只有一个,默认调用。如下:

class Cat :public Animal{
    public:
        Cat():Animal(){//调用父类的构造方法
            cout<<"Cat init=="<<endl;
        }

        void sayHi(){//重写父类函数   
            cout<<"cat say hi"<<endl;
        }

        void sayHi(string name){//重载函数
            this->name=name;
            cout<<name;
            this->sayHi();//this指针调用当前的sayHi()函数
          
        }
};


int main(){
    Animal a;//声明对象
    
    a.name="dog";

    Cat c;

    c.sayHi("Tom");

    Cat::getData();//调用父类的静态方法
  
    
}


init
init//子类调用的父类构造函数
Cat init==
Tomcat say hi
get data =====//父类的静态函数
Tomdestory  end=====//继承自父类的析构函数
dogdestory  end=====
    
    
//在主函数中末尾加入以下语句,输出结果发现对象的析构函数调用是按照栈特点来执行的。      
Animal pig;pig.name="pig";//先进后出

7、多态

多态是面向对象的重要特性,多态的重要特性之一就是重载。

如上的函数重载以及运算符重载。

 void sayHi(){//重写父类函数   
            cout<<"cat say hi"<<endl;
        }

void sayHi(string name){//重载函数
            this->name=name;
            cout<<name;
            this->sayHi();//this指针调用当前的sayHi()函数
    
        }

8、动态内存

C中的指针内存是手动分配,C++中提供了new和delete关键字用于处理内存分配。

这种分配是动态的,但也是需要手动管理。

   Cat* cat=new Cat;
   cat->name="jim";
   cat->sayHi();
   delete cat;

如果不使用delete关键字,那么cat对象的析构方法就不会被执行,cat所占用的内存将不会及时得到释放。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!