C++编程思想1

学了好久的 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 ;

}

 

 

 

 

时间: 2024-09-23 23:32:16

C++编程思想1的相关文章

算法设计-猜猜我是谁游戏设计编程思想

问题描述 猜猜我是谁游戏设计编程思想 像微软小冰的读心术类似通过程序给出的几个问题选择是否来推出所猜的人,这要用什么数据结构 解决方案 这个是根据语义匹配等算法实现的.

基于PHP的聊天室编程思想

编程|聊天室 1 页面登陆的基本要素你可以在我的竹叶看到登陆 的表单,这里提供了最基本的登陆表单项(1)登陆表单<form method=POST name=chatform action=chat/login.php?action=enter onSubmit="b1_submit();return true;" target="howtodo">(a)聊天表单的名字为chatform,我使用action=enter作为进入聊天室的入口,如果没有这个参

关于继承内部类——java编程思想示例程序分析

编程|程序|继承|示例 关于继承内部类--java编程思想示例程序分析:class Egg2 { protected class Yolk { public Yolk() { System.out.println("Egg2.Yolk()"); } public void f() { System.out.println("Egg2.Yolk.f()"); } } private Yolk y = new Yolk(); public Egg2() { System

在ASP.NET中面向对象的编程思想

asp.net|编程|对象 首先,我们还是来谈一下面向对象的编程思想吧.我想现在的主流编程思想无非两种:结构与面向对象.以前,在ASP中我们完全采用的是结构化思想.现在,asp.net可以完全支持面向对象的编程思想,这不得不说是一个质上的飞跃. 记得我在大约半年前给大家写过一篇<<面向对象从人造地球谈起>>,当时是由于看到一本小说的启发,发现任何东西都可以用面向对象的思想来看.我现在还是简单谈一下吧,面向对象无非就是把世间万物当做一个类,要想使用类做事,就必须创建类的实例.这很好理

简述AngularJS相关的一些编程思想

  这篇文章主要介绍了AngularJS相关的一些编程思想,AngularJS是一款热门的JavaScript库,推荐!需要的朋友可以参考下 在过去的几个月里,我一直遨游于Angular的世界.如今回想起来,很难想象在没有类似于Angular.js, Backbone.js以及其伙伴Underscore.js这些数据绑定框架下我每天如何去编写一个大型前端应用.我不敢相信我已经用它们完成了那件工作. 可能我有点小偏见,但考虑到我一直在做的应用是在浏览器中实现Photoshop类型的编辑器,它呈现相

android-怎么形成编程思想,写代码的时候不知道该干什么

问题描述 怎么形成编程思想,写代码的时候不知道该干什么 最近在看视频学Android,可以看懂视频中的大多数代码,但是让我自己写就有点难了,写完这一步不知道下一步该干什么,甚至是根本不知道该怎么下手,请问怎么才能形成编程思想啊,写不出来就很烦 解决方案 无论是使用什么编程语言,你首先需要确定需求,即功能的定义. 自己用纸来写出整个流程,当然用 Visio 等工具也可以,编程只是个实现的过程,编程用的语言只是个工具.如果你都不清楚想要做什么,和怎么去做,那使用什么编程语言都是一样的. 解决方案二:

C语言之通过冒泡排序浅谈编程思想

写这篇博文的目的是想起到抛砖引玉的作用,还请大牛们留下一些先进的思想,让小菜学习一下.下面入正题. 复习C语言怎么能少的了冒泡呢,记得刚学C语言那会,感觉冒泡排序真的太复杂了,理解不大了,嗯!还是当时的功底不够啊.当时一些冒泡都头疼,感觉这么多的循环(哈哈!!其实也就俩,当时就是感觉太复杂).现在再写冒泡排序,感觉自己当时学C语言的时候是不是太笨了呢. 仔细想想,之前写冒泡之所以感觉到难是没有真正的理解冒泡的思想,就硬着头皮写,结果可以想象,是以失败而告终的.现在写代码也有一段时间了,学的编程语

qt-Linux下QT编程思想,工作流程

问题描述 Linux下QT编程思想,工作流程 大家好!刚入门linux,想问一下大家QT在linux中编程的大概思想是什么啊?或者说是工作流程?比如说是如何判断屏幕动作发生的或者动作发生是如何处理的?希望大家赐教 解决方案 学过qt吗,用一个星期学下,你就发现qt其实很简单,我这里有全套qt教程,可以给你,QQ1119331234需要加我 解决方案二: http://www.pudn.com/downloads562/ebook/detail2314408.html 解决方案三: QT在嵌入式L

学习JAVA编程思想4的好方法

问题描述 跪求大神总结学习JAVA编程思想4的好方法. 解决方案 解决方案二:Java编程思想是很好的学习Java的材料,但对初学者来说有的地方不是能够轻易明白的.因为Java涉及的概念和技术非常广泛,建议先把基础夯实,比如类,接口,继承,多态等,这些有了基础后可以再深入学习正则表达式.线程.io等,一定要动手编写代码,并确实明白代码的执行逻辑.解决方案三:1.背把那些死知识背下来,复习巩固2.敲可以按书本例子课后题敲,对没掌握的可以重复敲3.测找其他题测试掌握情况,最好找SCJP题库的题,因为

C# 4.0新特性-&quot;协变&quot;与&quot;逆变&quot;以及背后的编程思想

在<上篇>中我们揭示了"缺省参数"的本质,现在我们接着来谈谈C#4.0中另一个重要的新特性:协变(Covariance)与逆变(Contravariance).对于协变与逆变,大家肯定不会感到陌生,但是我相信有很多人不能很清晰地说出他们之间的区别.我希望通过这篇文章能够让读者更加深刻的认识协变与逆变.但是也不排除另一种可能,那就是读者这篇文章你对这两个概念更加模糊.文章一些内容仅代表个人观点,如有不妥,还望指正. 目录 一.两个概念:强类型与弱类型 二.委托中的协变与逆变的