大刘 发布的文章

C++中的文件读写操作

#include<iostream>
#include <fstream> //头文件引用
using namespace std;

//输出到缓冲区(写文件)
void test01()
{
    //流对象 参数 1 文件路径 2 打开方式
    //ofstream ofs("./test.txt", ios::out | ios::trunc);
    ofstream ofs;
    ofs.open("./test.txt", ios::out | ios::trunc); //指定打开方式

    //判断是否打开成功
    if ( ! ofs.is_open() )
    {
        cout << "文件打开失败" << endl;
    }

    ofs << "姓名:德玛" << endl;
    ofs << "年龄:18" << endl;
    ofs << "身高:165cm" << endl;

    ofs.close(); //关闭流对象,更新缓冲区
}

//输入到缓冲区(读文件)
void test02()
{
    ifstream ifs;
    ifs.open("./test.txt",ios::in); //读文件

    if (ifs.is_open() == false)//可以这样写if(!ifs)
    {
        cout << "文件打开失败" << endl;
    }
    //第一种方式读文件
    //char buf[1024] = {0};
    ////每次都读1行数据,并且放到buf中
    //while (ifs >> buf)//肯定重载了>>运算符
    //{
    //  cout << buf << endl;
    //}


    //第二种方式
    //char buf[1024] = { 0 };
    //while (!ifs.eof()) //判断是否读到文件的尾部
    //{
    //  ifs.getline(buf, sizeof(buf));
    //  cout << buf << endl;
    //}


    //第三种方式 单个字符读取
    // ifs.get() 以单个字符读取文件
    char c;
    while ((c = ifs.get()) != EOF)
    {
        cout << c;
    }

    //关闭文件对象
    ifs.close();




}

int main(){

    test01();//运行test01后在相应的目录中能找到test.txt文件

    test02();//要保证相应的目录中有test.txt文件

    system("pause");
    return EXIT_SUCCESS;
}

函数模板具体化

我们知道函数模板是把数据类型参数化了,一个函数模板可以传入不同的数据类型,都可以使用这个函数功能,但这里的数据类型只是基础数据类型,我们自己定义的数据类型就不可以,因为c++的编译者们并不知道用户定义的是什么样的数据类型,这个时候我们就要把函数模板具体化,其实就是告诉编译器我们自己定义的数据类型该怎么样使用:
class Maker{
public:
    Maker(string name, int age)
    {
        this->name = name;
        this->age = age;
    }
public:
    string name;
    int age;
};
template<class T>
void mySwap(T &a, T &b)//要有这个函数模版,下面的具体化函数模版才不会报错
{
    if (a > b)
    {
        cout << "a>b" << endl;
    }
    else{
        cout << "a<=b" << endl;
    }   
}
//具体化函数模版,具体化函数模版优先于常规函数模版
template<> void mySwap<Maker>(Maker &p1, Maker &p2)
{
    cout << "具体化" << endl;
    if (p1.age > p2.age)
    {
        cout << "p1>p2" << endl;
    }
    else
    {
        cout << "p1<=p2" << endl;
    }
}
int main()
{
        int a = 10;
    int b = 20;
    mySwap(a, b);
    
    Maker p1("悟空", 20);
    Maker p2("布尔玛", 24);

    mySwap(p1, p2);
        return 0;
}

指针的意义——间接赋值

通过指针间接赋值成立的三大条件:
1.2个变量(一个普通的变量一个指针变量)
2.建立关系
3.通过*操作指针指向的内存

void test()
{
    int a=100;
    int *p=NULL;
    p=&a;
    *p=20;
    printf("%d\n",a);//a=20;
}

面向对象的三大特征

面向对象的三大特征---封装,继承,多态
封装:
把属性和方法封装起来
class Maker{//类
public:
string name;//属性
int age;//属性
public:
void printClass()//方法
{
cout<<name<<age<<endl;
}
}
void test()
{
Maker maker;//maker为对象
}
继承:
class Son:public Maker{
public:
string SonName;
int SonAge;
public:
void printSonClass()
{
cout<<"Son"<<endl;
}

}
Son中有属性:SonName,SonAge,name,age
Son中有方法:printClass(),printSonClass();
多态:有继承,有重写父类的虚函数,有父类指针或引用指向子类对象。

C++与C的三目运算符的区别

C语言中的三目运算符返回的是右值,C++语言中三目运算符返回的是左值
C语言
int main()
{
//C语言
int a=10;
int b=20;
printf("%d/n",a>b?a:b);
a>b?a:b=30;//会报错
int c=a>b?a:b;//ok

//C++
a>b?a:b=30;//不会报错

}