C++编程思想1

简介: 学了好久的 C++了 发现自己对于C/C++还是没有深入的了解 于是 咬咬牙啃起了 C++编程思想 希望能有所感悟 。。 我以前是直接学C++的对于C不是很了解,然而又是在VC下 学习 所以 没有好好的 去学习 标准C++,直到我 看起C++编程思想  我发现真应该从头再学一遍了  。

学了好久的 C++了 发现自己对于C/C++还是没有深入的了解 于是 咬咬牙啃起了 C++编程思想 希望能有所感悟 。。

我以前是直接学C++的对于C不是很了解,然而又是在VC下 学习 所以 没有好好的 去学习 标准C++,直到我 看起C++编程思想  我发现真应该从头再学一遍了  。。。

 

1、定义的声明的区别  :

声明是 声明了标示符的存在 并没有为 其分配空间   ,而定义 是为其分配的一定的存储空间

int * p ;//这是对指针的声明 并且定义

int p;//这是对整形变量的声明并且定义

exern void show() ;==void show() ;

对于函数来说只要没有函数体 那么都是声明  extern 表示对函数的声明 表示这个函数是再外部定义的 。

我们在编译器下 同时写下

int i;

int i ;//会出现冲的定义的错误    编译器会理解为"我到底改用那个i呢?"

 

extern int i ;

int i ;//那么就不会出现错误 原因是 第一个i是一个对于变量的声明 并没有分配存储空间  第二次 才为 i分配了存储空间 

 

2、  memcpy 函数  void *memcpy( void *dest, const void *src, size_tcount );

这个函数我们在C中经常用到  ,其实 他 跟 strcpy很类似 都是向目的类型的地址 拷贝 n个 内存块 

注意这里的参数是 void*    因为我们是对内存块进行操作  所以可以是任意数据类型

程序员对于内存的理解应该一视同仁 没有类型的区别 。 只是我们在使用内存的时候 将二进制代码 进行了 数据化了

3、  malloc函数和 calloc函数    assert函数

void *malloc( size_t size);

void *calloc( size_t num, size_tsize );

void assert( int expression );  //如果参数是FALSE那么 强制终止程序的运行  也就是 非0 退出

这两个函数都是在堆中分配指定大小的void* 内存区域    只是calloc可以进行初始化   

而 malloc函数不进行初始化  。当malloc函数分配的内存在 第一次被使用的时候 那么 它的每个单元的数据可能是  0

但是 如果分配来的这块内存区域被使用过了 那么就可能使任意数了 。

这里我们会问free函数 做什么了?

free函数 只是告诉编译器 我们之前用malloc分配的内存区域 可以重复使用而已,在一定程度上可以理解为释放 

 

现在想想 我们的 fopen 函数和 fclose函数 所  用到的  FILE结构体也是 由此 而来的

4、标准库的发放形式

  我们在 VC中用到  string.h  等等头文件 就可以使用里面定义的函数 等等     我们可以找到 String.h  但是我们却找不到他的实现文件 CPP (也就是源文件) 

在以往的C库的编写中我们通常 将具有 统一功能 和 分类的 一组 数据类型 和函数放在一个 头文件中定义   ,然后再原文件中实现 。然而我们到 微软提供的VC下面却找不到 这些对应文件的实现  。这是因为对于 微软而言 我们是使用VC的用户 ,虽然我们是软件开发者,但是我们是在微软的平台下使用。  

微软给我提供了的借口是 头文件+动态链接库的 形式  而不是 头文件+源文件的形式 。 

对于微软而言 不会给我们 库的实现部分 。只需要给我们提供动态链接库,我们就可以使用它们所定义的函数 以及类型

 

5、重复定义的问题  

    #ifndef test   

#define final
#endif

 

在一个较大的工程中我们可能会用到多个头文件  架设 我们在多个头文件中同时包含了 一个头文件 那么 在 编译器进行编译链接的时候 

就会发生 数据类型或者 函数的 重复定义问题 为了解决这个问题 那么我们要用到 预编译指令

如果在  lib.h的头文件下有 int i ; 为了防止被重复定义 那么 我们在 lib.cpp中应该这样定义 

#ifndef  lib_H_

int  ;

#endif  ; 

这样就可以防止统一数据 被重复定义的问题

 

6、  C++的封装

C++的封装  这是一个歧义的问题?

有些人把封装用在解释隐藏上 ,而我觉得用来解释类这一个抽象数据类型很合适  、

在以前的C中  struct 结构体中我们吧 一组相关的 属性组合成一个结构体  那么这个结构体 只是作为数据的封装,没有其他的实际意义。

但是在C++中则不同了。

类中可以加入函数 ,等操作行为 使面向对象的思想得以很好的实现,一个类代表一类事物,一个类的实例代表一个对象 ,这个对象有自己的属性和行为 。

我们把操作的函数封装在类中 也可以避免C中函数命名重复的问题 。

 

 6、联合 Union  枚举  enum的简单实用 

  对于联合 来说他的大小是成员中数据类型字节最大的存储 我们在使用的时候 使用数据类型中的一个 可以节约存储空间

enum其实定义的是基于 0开始的 一些数据成员 当然我们可以对枚举成员进行赋值 简单应用如下

#include <iostream>
using namespace std ;
enum Day
{
 one =433,
 two ,
 three
};
union Me
{
  int a ;
  char buf[100]  ;
};
void main()
{
     Day a =one;
  Day b= two ;
  cout<<a<<endl ;
  cout<<b<<endl ;
  Me me1,me2 ;
  me1.a=100 ;
  strcpy(me2.buf,"dsfds") ;
  cout<<"Union中的数字:"<<me1.a<<endl ;
  cout<<"Union中的字符串:"<<me2.buf<<endl;
  cout<<"Union的大小是:"<<sizeof(Me)<<endl ;


}

 

 

 

 

目录
相关文章
|
1月前
|
C++
C++ 数据封装的方法,重点是其编程思想
在C++中,数据封装一般指的是将数据和操作这些数据的函数绑定在一起的程序设计方式。通常使用C++的类来实现
36 7
|
8月前
|
设计模式 算法 搜索推荐
C++的编程思想和进阶编程
● 一个模式描述了一个不断发生的问题以及这个问题的解决方案;模式是前人的设计经验上总结出来的对于一些普遍存在的问题提供的通用的解决方案;比如单例模式、观察者模式等 ● 软件中有很多模式 面向对象常见的23中设计模式; 反模式;企业应用架构模式等
34 0
|
存储 C++ Java
c++编程思想2 --友元存储控制
 友元friend在c++中的应用  我们知道在c++的类访问权限中,private和 protected在类外面进行访问的时候 会因为权限而不能访问 ,友元就解决了这个问题 。 可以这样理解,他为外部的 函数 或者类 进行了 访问授权,其实这已经超出OOP的范畴,但是对于C++而言是以实用为主,所以说C++并不是完全面向对象的语言 C++这一特性就破坏的C++的安全性 。
827 0
|
C++
C++编程思想3-利用C++进行文件操作封装C函数
我们知道在C语言中许多文件操作的函数 很零散,在使用的时候不得不四处查找 ,我们是否能向C++中 的   CFile类等一样封装我们自己的文件操作呢?当然可以,我们这里我封装的是 C语言的文件操作函数  。
939 0
|
22天前
|
存储 C++ 容器
C++入门指南:string类文档详细解析(非常经典,建议收藏)
C++入门指南:string类文档详细解析(非常经典,建议收藏)
31 0
|
22天前
|
存储 编译器 C语言
C++入门: 类和对象笔记总结(上)
C++入门: 类和对象笔记总结(上)
31 0
存储 编译器 Linux
18 0
|
2天前
|
编译器 C++
标准库中的string类(上)——“C++”
标准库中的string类(上)——“C++”
|
2天前
|
编译器 C++
自从学了C++之后,小雅兰就有对象了!!!(类与对象)(中)——“C++”
自从学了C++之后,小雅兰就有对象了!!!(类与对象)(中)——“C++”