ACLGUI IN SSTC(PIA)2020中可能遇到的一些知识点

在这里插入图片描述

(一)条件编译

一般情况下,C语言源程序中的每一行代码.都要参加编译。但有时候出于对程序代码优化的考虑.希望只对其中一部分内容进行编译.此时就需要在程序中加上条件,让编译器只对满足条件的代码进行编译,将不满足条件的代码舍弃,这就是条件编译(conditional compile)。

1.if格式

#if 表达式
     语句序列①
[#else
     语句序列②]
#endif

功能:当表达式的值为真时,编译语句序列①,否则编译语句序列②。其中,#else和语句序列②可有可无。

2.ifdef格式

#ifdef     标识符
     语句序列①
[#else
     语句序列②]
#endif

功能:当标识符已被定义时(用#define定义),编译语句序列①,否则编译语句序列②。其中#else和语句序列②可有可无。

3.ifndef格式

#ifndef     标识符
     语句序列①
[#else
     语句序列②]
#endif

功能:该格式功能与ifdef相反。

4.补充内容

#undef
作用:在后面取消以前定义的宏定义。
示例1:

#include <iostream.h>
#include<string.h>
#define MAX 5
#undef MAX
void main()
{
    char name[MAX]="abcd"; //最多四个字符,否则会提示说超出长度,原因是由于字符串末尾有'\0'字符
    cout<<"MAX = "<<MAX<<endl;
    for(int i=0;i<MAX;i++)
    cout<<name<<" "<<endl;
}

我们定义了MAX但又将其取消,会得到“未定义符号MAX”的错误提示。

示例2:

#include <stdio.h>
int main( void )
{
#define MAX 200
    printf("MAX= %d\n",MAX);
#undef MAX
#define MAX 300
    printf("MAX= %d\n",MAX);
    return 0;
}

我们可以像这样修改已经宏定义的符号常量的值。

示例3:

#define TEST_A 1
#define TEST_CLASS_A clase T1
#include "TEST.h"
#undef TEST_A
#undef TEST_CLASS_A

此段代码中,在头文件TEST.h中,这两个宏定义语句起作用,该头文件之后,它们就会释放掉。

(二)部分头文件

1.windows.h

Windows.h头文件封装了许多库函数以及一些类,将一些复杂的工作由库函数处 理,Windows.h头文件中包含了Windef.h、Winnt.h、Winbase.h、Winuser.h、Wingdi.h等头文件,涉及到了Windows内核API,图形界面接口,图形设备函数等重要的功能。
其中常用的函数包括休眠函数sleep(),清屏函数system(“cls”)等。

2.commctrl.h

一个包含大量接口的windows控件
具体内容参考commctrl.h

注:commctrl.h不能单独使用,在引入该头文件时,我们应该先加上#include<windows.h>

3.sstream

sstream,即字符串流,通常是用来做数据转换的。比如

int n=10000;
char s[10];
sprintf(s,%d”,n);// s中的内容为“10000”

详情可以参考sstream

4.ctime

见官网文献cmath

(三)空指针

空指针是一个被赋值为0的指针,在没有被具体初始化之前,其值为0。由系统保证空指针不指向任何实际的对象或者函数。同时,任何对象或者函数的地址都不可能是空指针。

具体操作示例

#define NULL 0
char *p = NULL;

注:先把要赋值的变量的地址赋给空指针,然后才能把变量的值赋给该指针。

常见问题1:空指针指向了内存的什么地方?

标准并没有对空指针指向内存中的什么地方这一个问题作出规定,也就是说用哪个具体的地址值表示空指针取决于系统的实现。我们常见的空指针一般指向 0 地址,即空指针的内部用全 0 来表示;也有一些系统用一些特殊的地址值或者特殊的方式表示空指针。
在实际编程中不需要了解在我们的系统上空指针到底是一个 zero null pointer 还是 nonzero null pointer,我们只需要了解一个指针是否是空指针就可以了——编译器会自动实现其中的转换,为我们屏蔽其中的实现细节。注意:不要把空指针的内部表示等同于整数 0 的对象表示,有时它们是不同的。

常见问题2: 在实际的操作中,如何判断某个指针是不是空指针?

可以通过与空指针常量或者其它的空指针的比较来实现(注意与空指针的内部表示无关)。
如果 p 是一个指针变量,
若进行: p = 0;、p = 0L;、p = ‘\0’;、p = 3 - 3;、p = 0 * 17; 中的任何一种赋值操作之后(对于 C 来说还可以是 p = (void*)0;),p 都成为一个空指针,并且由系统保证空指针不指向任何实际的对象或者函数。 反过来说,任何对象或者函数的地址都不可能是空指针。

指针变量 p 是空指针的判断:(假设 p 是一个指针变量,q 是一个同类型的空指针,要检查 p 是否是一个空指针)
if ( p == 0 )
if ( p == ‘\0’ )
if ( p == 3 - 3 )
if ( p == NULL ) /* 使用 NULL 必须包含相应的标准库的头文件 */
if ( NULL == p )
if ( !p )
if ( p == q )

常见问题3:可以定义自己的 NULL 的实现吗?

NULL 是标准库中的一个保留标识符。所以,如果包含了相应的标准头文件而引入了 NULL 的话,则再在程序中重新定义 NULL 为不同的内容是非法的,其行为是未定义的。

(四)new,delete与指针

在C++中,如果定义了对象,在内存中给它分配了空间;如果使用完以后,忘了销毁对象,即无法释放它所占用的内存空间。则这些内存空间一直被占用,直到重启计算机才可释放,这样就造成了内存泄露。

new创建对象

new操作符相当于一个函数,在内存分配完空间后,返回这个空间的首地址。

void main()
{  
   Point *p1=new Point(1,1);
   Point *p2=new Point(2,2);
}

delete销毁对象

用new命令可以为对象在内存中动态分配一定的空间,并返回分配空间的首地址;如果在程序运行结束之前没有用delete来销毁这些对象,释放它们所占用的空间也会发生内存泄露。

void main()
{
    Point *p1=new Point(1,1);
    Point *p2=new Point(2,2);
    delete p1;
}

指针p1所指向的对象因为调用了delete,则调用了析构函数,而销毁了对象;而指针p2指向的对象只是调用了new,而没有调用delete,没有被销毁,则发生了内存泄露。

因此,用new创建的对象都应当在程序内及时销毁。

(五)ACLLIB中部分函数的使用(未完成)

ACLLIB

(六)template(未完成)

函数模板定义一族函数。它声明一个通用的类模板,使之可以有一个或多个虚拟的类型参数。
函数模板的格式:

template< class T>(此处的T也可以用别的标识符替代)
prototype

函数模板在形式上分为两部分:模板、函数。在函数前面加上 template< class T>就成为函数模板,因此对函数的各种修饰(inline、constexpr 等)需要加在prototype上,而不是 template 前。

(七)作用域与extern(未完成)

局部作用域

全局作用域

对于对象而言(其他也是一样的),在main函数中,对象的作用域为他所在的最近的一对花括号内。在后花括号处析构函数被调用;全局的对象的作用域为声明之后的整个文件,析构函数在最后被调用。另外,临时产生的对象在使用完后立即会被析构。

extern关键字

extern

(八)简单的文件操作(未完成)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值