日常笔记:C/C++

一、class和struct有什么区别

这里有两种情况的区别:

1)C语言的struct和C++的class区别

这种情况下,C语言的struct结构体就像是一种复杂的数据结构类型定义,struct中只能定义数据成员,不能定义函数。

举例:下面这段代码在C语言中

struct Point
{
    int x;//合法
    int y;//合法
    void print()
    {
        printf("Point print\n")://编译错误
    }
};

上面的代码会产生编译错误,是因为C语言并不支持结构体里面定义函数成员。

2)C++中的struct和class的区别

这种情况下,结构体和类基本上是相似的,先看下面的代码:

#include 
using namespace std;
//类
class CPoint
{
    int x;//默认为private
    int y;//默认为private
    void print()//默认为private
    {
        cout<<"Point:("<< x << ","<< y <<")" <

在上面的程序中,struct还有构造函数和成员函数。其实它还拥有class的其他特性,例如继承和虚函数等。C++中的struct扩充了C的struct功能。

我们编译上面的代码,发现编译错误全部都是因为访问private成员引起的。由此可知,class中默认的成员访问权限是private的,而struct中则默认是public权限。

总结:C语言的struct与C++的class区别:struct只是一种复杂的数据类型定义,不可以用于面向对象编程。

          C++中的struct与class的区别:对于成员访问权限而言,class默认是private的,而struct中则默认是public的。


二、常见文件系统 系统函数

1、fcntl  文件控制  

     int fcntl(int fd, int cmd);

     fcntl()针对(文件)描述符提供控制.参数fd 是被参数cmd操作的描述符.

     针对cmd的值,fcntl能够接受第三个参数int arg

2、open  打开文件  

      int open(const char * pathname, int flags);

      int open(const char * pathname, int flags, mode_t mode);

     pathname是路径,flags是与打开方式相关的一些标志,mode是模式选择

3、creat  创建新文件 

     int creat(const char * pathname, mode_t mode);

4、close  关闭文件描述符

     int close(int fd);

5、read  读文件  

    ssize_t read(int fd, void * buf, size_t count);

    buf是目标缓存区,count是字节大小,从文件中读到缓存区中

6、write  写文件  

    ssize_t write(int fd, const void *buf, size_t nbyte);

    buf是指定的缓存区,nbyte是大小,从buf中写到文件中

7、readv  从文件读入数据到缓冲数组中  

    ssize_t readv(int fd, const struct iovec *iov, int iovcnt);

    iov是结构体数组,每个元素指向一个缓冲区,iovcnt是数组中元素的个数

8、writev  将缓冲数组里的数据写入文件  

    ssize_t writev(int fd, const struct iovec *iov, int iovcnt);

9、pread 对文件随机读  

    ssize_t pread(int fd, void * buf, size_t count, off_t offset);

    buf是用来存放读取的数据的缓冲区,count是读取的大小,offset是开始读取点的文件偏移量

10、pwrite  对文件随机写

    ssize_t pwrite(int fd, const void * buf, size_t count, off_t offset);

    buf是用来存放要写入文件中的数据,offset是文件偏移量,从哪里开始写入


三、堆和栈的区别

堆:一般由程序员分配释放,若程序员不释放,会造成内存泄漏,程序结束时可能由OS回收,分配方式和链表类似。

栈:由操作系统自动分配和释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。


四、memcpy和strcpy的区别

1)复制的内容不同。strcpy只能复制字符串,而memcpy可以复制任意内容,例如字符数组、整型、结构体、类等。

2)复制的方法不同。strcpy不需要指定长度,遇到 '\0' 结束复制,所以容易产生溢出。memcpy则是根据第三个参数决定复制的长度,限制了大小所以不会出现溢出,是安全的。

3)用途不同。通常在复制字符串时用strcpy,而在需要复制其他类型数据时一般用memcpy。


五、Volatile与Register修饰符的作用

    Volatile的作用是:

作为指令关键字,确保本条指令不会因编译器的优化而省略,且要求每次直接读值,Volatile表示这个变量会被一项不到的改变,每次使用它的时候都需要重新从内存中读取一遍,确保读到的值是最新的,不适用于寄存器保存的副本。

1)并行设备的硬件寄存器(如:状态寄存器)

2)一个中断服务子程序中会访问到的非自动变量(Non-automatic variables)

3) 多线程应用中被几个任务共享的变量

    Register修饰符的作用:

暗示编译程序相应的变量将被频繁的使用,如果可能的话,将其保存在CPU的寄存器中,加快其存取的速度。


你可能感兴趣的:(日常笔记:C/C++)