C++:数据类型

1 C++

  1.1 什么是C++语言呢?

    C++语言是面向过程编程的高级语言, 同时也可以向高级语言一样面向对象编程,泛型编程;

    C++语言派生自C语言,所以C++语言可以向下兼容C语言;C++相比C,扩展了面向对象编程,泛型编程;

    C++语言大小写敏感,支持ANSI标准;

    G++编译器是将 gcc 默认语言设为 C++ 的一个特殊的版本;如果命名遵循规范,那么通过gcc来编译c++也是可行的;

  1.2 C++面向对象的特性

    1.2.1 封装 Encapsulation:将程序打包封装成接口,隐藏实现细节,只对外提供调用接口;

    1.2.2 继承 Inheritance:  从已有类中派生出新类,新类具有已有类的属性和方法,并且可以扩展或修改这些属性和方法;

    1.2.3 多态 Polymorphism:同一种操作作用于不同的对象,可以有不同的解释和实现。它可以通过接口或继承实现,可以提高代码的灵活性和可读性;

    1.2.4 抽象 Abstraction:  从具体的实例中提取共同的特征,形成抽象类或接口,以便于代码的复用和扩展;

  1.3 C++语言分布

    1.3.1 基础数据结构:              变量,数据类型,常量等;    用于构造数据类;

    1.3.2 C++标准库:                 C++标准库函数;                 用于操作文件,字符串等;

    1.3.3 C++标准模板库(STL):  C++标准库方法函数;           用于操作数据结构等;

2 C++基本语法

  2.1 数据类型转换 cast

    2.1.1 静态转换 static_cast:         用于将一种数据类型的值 转换为 另一种相似的数据类型的值;

                       转换时不进行类型检查,因此可能会引发异常;

    2.1.2 动态转换 dynamic_cast:    用于将基类指针或引用 转换为 派生类指针或引用;

                       转换时会进行类型检查,如果不能进行转换则返回空指针或引发异常;

    2.1.3 常量转换 const_cast:         用于将const类型的对象属性 转换为 非const类型的对象属性;

    2.1.4 重新解释转换reinterpret_cast:用于将一种数据类型的值 转换为 另一种数据类型的值;

                     转换时不进行类型检查,因此可能会引发异常;

int i = 10;
float f = static_cast<float>(i); // 静态将int类型转换为float类型

class Base {};
class Derived : public Base {};
Base* ptr_base = new Derived;
Derived* ptr_derived = dynamic_cast<Derived*>(ptr_base); // 将基类指针转换为派生类指针

const int i = 10;
int& r = const_cast<int&>(i); // 常量转换,将const int转换为int

int i = 10;
float f = reinterpret_cast<float&>(i); // 重新解释将int类型转换为float类型

  2.2 类作用域变量

    声明在类内部的变量,使用类名和作用域解析运算符“::”来访问;

#include <iostream>
class MyClass {
public:
    static int class_var;  // 类作用域变量
};
int MyClass::class_var = 30;
int main() {
    std::cout << "类变量: " << MyClass::class_var << std::endl;
    return 0;
}

  2.3 引用变量

    2.3.1 引用变量声明

      定义:引用其他变量的变量,作用类似指针但不是指针;

      属性:引用变量在创建时必须初始化其被引用对象,引用变量的被引用对象不能修改;不存在空引用;

int    i;
int&    r = i;    //声明引用变量r,i是被引用变量;这样可以通过r,i变量访问同一块内存;

    2.3.2 引用变量作用

      2.3.2.1 作为函数形参传递,传递之后对引用变量的修改就相当于对被引用变量的修改,作用等价于指针,但是更安全;

      2.3.2.2 作为函数返回值传递;注意这里有点反常识但是合理,此时函数可以被放在等式左边用来赋值;

double vals[] = {10.1, 12.6, 33.1, 24.1, 50.0};
double& setValues(int i) {  
   double& ref = vals[i];    // 这里引用声明,传递的是vals[i]的内存,那可不就是地址了嘛;
   return ref;               // 返回引用变量,这样函数就可以被放在等式左边用来赋值了;    
}

setValues(1) = 20.23;        // 将20.23存储到 vals[1]了;

 3 类

  类是一种自定义数据类型,可以用来创建具有相同属性和行为的多个对象;是C++的核心特性;

#include<iostream>
using namespace std;
//记录一下我的第一个c++程序,虽然这是一个因为傻吊主管而半途而废的新起点;
class Box{                                      //声明一个类,名字为Box;
    public:                                     //声明类成员的访问属性public;
        double length;                          //声明类变量
        double height;
        void set(double length,double height);   //声明类方法函数
        double get_area(void){                   //函数定义在类内,则默认声明为内联inline函数;
            return length * height;
        }
};

    void Box::set(double len, double hei){
	    length = len;
	    height = hei;
    }

int main(){
    cout<<"hello c++ \n"<<endl;
    Box box1;
    double area;

    box1.set(15,30);
    area = box1.get_area();
    cout<<"box1.get_area:"<< area <<endl;
}

  3.1 类成员 访问修饰符

    一个类内部可以有多种访问修饰符,不写访问修饰符默认为private属性;

    3.1.1 public 公有属性:     在当前类、类的外部也可以访问类内部的公有成员;

    3.1.2 protected 受保护属性: 在当前类、友元函数和派生类中可以访问受保护成员;

    3.1.3 private 私有属性:         在当前类、友元函数可以访问私有成员;派生类不可以访问;

  3.2 派生类 继承属性    

    派生类成员可以继承基类成员的访问属性;private继承,则派生类成员不能访问基类成员;

    3.2.1 public class_A 继承:  基类 public,protected,private成员的访问属性在派生类中分别变成:public, protected, private;

    3.2.2 protected class_A 继承: 基类 public,protected,private成员的访问属性在派生类中分别变成:protected, protected, private;

    3.2.3 private class_A 继承:   基类 public,protected,private成员的访问属性在派生类中分别变成:private, private, private;

  3.3 构造函数

    类的构造函数 会在每次创建新的类对象时执行;

    名称与类完全相同,没有返回类型,可以带参数类型;作用主要是用于为成员变量设置初值;

  3.4 析构函数

    类的析构函数 会在每次删除已创建的类对象时执行;

    名称与类完全相同但是加了一个~,没有返回类型,没有参数类型;作用主要是用来释放资源;

  3.5 拷贝构造函数

  3.6 友元函数

  3.7 内联函数

  3.8 this指针

  3.9 指向类的指针

  3.10 静态成员

 

4 纯虚函数

  声明在基类中的函数;它在基类中没有定义不能实例化,由派生类重新声明后才能实例化;看来主要作用是占位,先放着;

模板

//比如定义的时候是template<class V, class M=void>;
//那等会代码中的类名V就替换掉;代码中的M就替换成void;

//比如在在View类中写了 template<class P>
//引用的时候代码为:View<WatchDrainagePresenter>
//表示等下View类中的V都用WatchDrainagePresenter替代了;

  

 

 

上面这几个类型转换里,const_cast<>,reinterpret_cast<>里为什么有& ??先放着;

引用变量的&号靠近变量放着可以么?先放着;

  

 

posted @ 2024-09-29 21:22  caesura_k  阅读(4)  评论(0编辑  收藏  举报