一、怎样用C++的源文件产生一个可运行程序

一个C++程序由一个或者多个编译单元组成。每一个编译单元都是一个独立的源码文件。一般是一个带.cpp的文件,编译器每次编一个文件编译单元,生成一个以.obj或者.o为后缀的目标文件。程序就是执行在这些目标文件上。这些目标文件都是二进制的文件。一旦全部的编译单元都生成了目标文件,我们就用连接器将他们连接成一个可执行的.exe文件。

我们能够在一个.cpp文件里实现多个类,也能够将多个类分散的放在多个.cpp文件里。

当改动了某一个.cpp文件后,我们仅仅须要又一次编译这个文件。就可生成新的可运行程序。

通过编译器。能够将两个cpp文件分别编译生成.o文件。在通过.o文件生成可运行程序。比如:

CC -c main.cpp

CC -c test.cpp

CC main.o test.o -o test

最后运行./test 123

在main文件里调用了test文件里的函数。在调用前须要声明test中的函数。假设文件过多的时候会出现反复声明的问题,比方A中声明了B中的函数。C中也声明了B中的函数,这时候用A调用C时会出现这个函数声明反复的错误。连接器会报错输出“unresolved symbol”(不可解析的符号),所以在实际应用中。我们是通过将这个函数声明写入头文件里,如.h\.hh\.phh\.hxx等。在我们须要调用这个函数的时候。包括这个函数的头文件就能够了。格式例如以下:

#ifndef TEST_H

#define  TEST_H

int test(int);

#endif

不要觉得程序就是一些目标文件组成的。实际情况中。可运行程序通常都会连接很多库。这些库已经实现了很多现成的功能。库主要有两种类型:

l 静态库能够直接放入可运行程序中。就像目标文件一样,但会使可运行文件变得非常大。

l 动态库DLL位于机器上的标准位置,而且在应用程序启动的时候自己主动载入他们。

C++的可编译性和对性能的追求是不同于Java和C#等语言的。

C++不会在执行时检測数组是否越界,没有垃圾信息收集器回收那些分配出去可是不再使用的动态内存。

高字节在后的系统架构(如PowerPC和SPARC)。23位变量值0x12345678会存储为4个字节:0x12、0x34、0x56、0x78。对于高字节在前的系统架构(比方Intel x86体系)。这些字节存储顺序会被颠倒过来。这样就会把内存区域中数据拷贝到磁盘或者在网络上发送二进制程序中产生差异。

二、C++语法

内敛函数(inline)在类定义中已经实现了方法。

与之相应的是把函数原型放在头文件里。而把实现这些函数的代码放在.cpp文件里。

从语法上讲这两种方法是等效的。可是当我们调用内联函数时,绝大多数编译器仅仅是对此函数做简单的扩展,而不会生成实际的函数调用。

这样会是程序执行效率更高。可是相应的会带来应用程序的增大。所以。仅仅有很easy的函数才实现为内联函数。

Virtual fun()=0//纯虚函数——没有默认实现代码而且必须在子类中实现的函数。

C++中,假设是仅仅想某个实例对象的指针要訪问类方法时,必须使用“->”,假设是实例则能够用“.”。

New动态分配的对象一般分配在“堆”上,而局部变量(在函数中定义的变量)则存储在“栈”里。

将指针定义为const类型,能够限制指针不让其改动它们,仅仅能用于调用常量成员。

Typedef又一次定义数据类型,设定成其它的名字(别名)

C++中的数据类型强制转换,此语法功能很强大。

能够改变指针类型,移除const等等。

C++中引入4种具有更为准确语义的新强制转换类型。

1、Static_cast<T>()可用于把指向A的指针强制转换为指向B的指针,其约束条件是类B必须是类A的子类。

2、Dynamic_cast<T>(),与Static_cast<T>()类似,仅仅是它使用的是执行时类型信息的方法来验证与这个指针相关的对象是否是类B的一个实例。

假设不是,强制转换就会返回一个空指针null。

3、Const_cast<T>()加入或移除对指针或者引用的const限定。

4、Reinterpret_cast<T>()把人一类型的指针或者引用转换成随意的其它类型。

可能有点模糊。我的理解就是Static_cast<T>()这样的情况是对那些操作转换规范不会出问题的转换用的,Dynamic_cast<T>()则是对那些可能出错的转换用的。由于有返回信息能够查看是否转换成功,希望有更好的解释在以下告诉我。其它两个还算比較清晰。

Static静态keyword的功能是让被此keyword声明的变量或者函数仅仅能在此编译单元下用,称这样的情况较静态连接(static linkage)。其它情况则成为外部连接(external linkage)。

命名空间的使用除了::前面加上这个命名空间名。还有以下三种机制:

定义命名空间的别名

Namespace a = aaaaaaaaaaaaaaaaaaaaaaaaa;

从命名空间中导入一个简单的标识符

Using aaaaaaaaaaaaaaaaaaaaaaaaaaa::fun;

fun();

仅仅用一条指令导入整个命名空间

Using namespace aaaaaaaaaaaaaaaaaa;

预处理器就是一个程序,能够把带“#”指令符转换成不在包括哪些指令符的源文件。

1、#include指令会把<>和””包括的头文件扩展成他们的内容。

2、#define替换成宏定义的内容。

3、#undef解除宏定义。

4、#if、#elif、#else和#endif能够处理或者跳过某部分代码。

5、#ifdef、#ifndef来避免反复包括某个头文件。

6、#error能够在编译时给出用户自己定义的错误信息。

C++简单介绍的更多相关文章

  1. [原创]关于mybatis中一级缓存和二级缓存的简单介绍

    关于mybatis中一级缓存和二级缓存的简单介绍 mybatis的一级缓存: MyBatis会在表示会话的SqlSession对象中建立一个简单的缓存,将每次查询到的结果结果缓存起来,当下次查询的时候 ...

  2. 利用Python进行数据分析(7) pandas基础: Series和DataFrame的简单介绍

    一.pandas 是什么 pandas 是基于 NumPy 的一个 Python 数据分析包,主要目的是为了数据分析.它提供了大量高级的数据结构和对数据处理的方法. pandas 有两个主要的数据结构 ...

  3. 利用Python进行数据分析(4) NumPy基础: ndarray简单介绍

    一.NumPy 是什么 NumPy 是 Python 科学计算的基础包,它专为进行严格的数字处理而产生.在之前的随笔里已有更加详细的介绍,这里不再赘述. 利用 Python 进行数据分析(一)简单介绍 ...

  4. yii2的权限管理系统RBAC简单介绍

    这里有几个概念 权限: 指用户是否可以执行哪些操作,如:编辑.发布.查看回帖 角色 比如:VIP用户组, 高级会员组,中级会员组,初级会员组 VIP用户组:发帖.回帖.删帖.浏览权限 高级会员组:发帖 ...

  5. angular1.x的简单介绍(二)

    首先还是要强调一下DI,DI(Denpendency Injection)伸手获得,主要解决模块间的耦合关系.那么模块是又什么组成的呢?在我看来,模块的最小单位是类,多个类的组合就是模块.关于在根模块 ...

  6. Linux的简单介绍和常用命令的介绍

    Linux的简单介绍和常用命令的介绍 本说明以Ubuntu系统为例 Ubuntu系统的安装自行百度,或者参考http://www.cnblogs.com/CoderJYF/p/6091068.html ...

  7. iOS-iOS开发简单介绍

    概览 终于到了真正接触IOS应用程序的时刻了,之前我们花了很多时间去讨论C语言.ObjC等知识,对于很多朋友而言开发IOS第一天就想直接看到成果,看到可以运行的IOS程序.但是这里我想强调一下,前面的 ...

  8. iOS开发多线程篇—多线程简单介绍

    iOS开发多线程篇—多线程简单介绍 一.进程和线程 1.什么是进程 进程是指在系统中正在运行的一个应用程序 每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内 比如同时打开QQ.Xcod ...

  9. iOS开发UI篇—UITabBarController简单介绍

    iOS开发UI篇—UITabBarController简单介绍 一.简单介绍 UITabBarController和UINavigationController类似,UITabBarControlle ...

  10. Android开发自学笔记(Android Studio)—4.界面编程与View组件简单介绍

    一.引言 Android应用开发最重要的一份内容就是界面的开发,无论你程序包含的内容多么优秀,如若没有一个良好的用户交互界面,最终也只是会被用户所遗弃.Android SDK提供了大量功能丰富的UI组 ...

随机推荐

  1. Oracle 了解 DDL 操作与 REDO 的关系

    目录 了解 DDL 操作与 REDO 的关系 DDL是否会产生REDO 通过 10046 trace 来分析create 和drop 如果drop失败,redo的变化 了解 DDL 操作与 REDO ...

  2. vs2012打开低版本项目时 出现vs2012警告未能加载包“visual c++ package 解决办法

    vs2012 打开 vs2010 项目时 提示的 错误信息. 解决办法 是下载一个 vs2012的 一个补丁包 http://www.microsoft.com/en-us/download/deta ...

  3. 大数据学习——kettle的简单使用

    1 生成随机数保存到本地文件 新建转换--输入--生成随机数--输出--文本文件输出--保存到本地文件 2 在线预览生成结果 3 字段选择 4 增加常量 5 生成多条数据 右键生成随机数--改变开始复 ...

  4. Install Oracle 11G Release 2 (11.2) on Oracle Linux 7 (OEL7)

    Install Oracle 11G Release 2 (11.2) on Oracle Linux 7 (OEL7) This article presents how to install Or ...

  5. django model的设计

    1 设计blog的显示界面: 在blog/admin.py修改 from django.contrib import admin from blog.models import BlogPost # ...

  6. phpstorm 快速插入常用代码片段

  7. Welcome-to-Swift-09类和结构体(Classes and Structures)

    类和结构体是人们构建代码所用的一种通用且灵活的构造体.为了在类和结构体中实现各种功能,我们必须要严格按照对于常量,变量以及函数所规定的语法规则来定义属性和添加方法. 与其他编程语言所不同的是,Swif ...

  8. java面试题之Executor和Executors的区别

    Executor 接口对象能执行我们的线程任务: Executors 工具类的不同方法按照我们的需求创建了不同的线程池,来满足业务的需求. ExecutorService 接口继承了Executor接 ...

  9. watch watch watch the video! I got almost addicted. Oh what a fuck!!!!

    http://v.huya.com/play/574329.html#relate_vid=570467

  10. js simple drag.

    // by zhangxinxu welcome to visit my personal website http://www.zhangxinxu.com/ // zxx.drag v1.0 20 ...