C/C++编程细节(二)

1、静态成员与类

A、静态成员属于类,而不是属于某个特定的对象,它是由该类的所有对象共享的,因此不能在类的构造方法中初始化

B,静态成员属于该类所有对象公有,可以被类对象调用

C,静态成员收private的限制

D,静态成员属于类和该类的所有对象,可以用类名直接调用

2、引用

引用为对象起了另外的一个名字,该对象是已经存在的对象,引用必须初始化,有类型

3、虚函数表、虚表指针

有虚函数的类,前四个字节是虚表指针,指向虚表。

class Test{
public:
    int a;
    int b;
    virtual void fun() {}
    Test(int temp1 = 0, int temp2 = 0)
    {
        a=temp1 ;
        b=temp2 ;
    }
    int getA()
    {
        return a;
    }
    int getB()
    {
        return b;
    }
};

int main()
{
    Test obj(5, 10);
    // Changing a and b
    int* pInt = (int*)&obj;
    *(pInt+0) = 100;
    *(pInt+1) = 200;
    cout << "a = " << obj.getA() << endl;
    cout << "b = " << obj.getB() << endl;
    return 0;
}

代码输出:200 10

3、const

c++中,声明const int i,是在哪个阶段做到 i只可读的。

答案:编译阶段。

4、数组指针与二维数组

(一)int a[3][4],下面哪个不能表示 a[1][1]?

A、*(&a[0][0]+5)

B、*(*(a+1)+1)

C、*(&a[1]+1)

D、*(a[1]+1)

答案:C

解析:

在二维数组中a[1]表示的是a[1][0]的地址,数组在内存中连续存储,所以a[1]+1表示的是a[1][1]的地址,所以D可以取得正确的值;

指针操作*(a+1)与a[1]等价,所以B也可以取得正确的值;

二维数组在内存中是行优先存储的,所以A中a[0][0]的地址加5可以取得正确值;

C选项错误,应改为*(&a[1][0]+1),否则,则指向a[2][0]。

(二) 要使指针变量p指向2维数组A的第1个元素,正确的赋值表达式是()

p=A或p=A[0]

p=A[0]或p=A[0][0]

p=A[0]或p=&A[0][0]

p=A或p=&A[0][0]

答案:第三个选项

分析:  A、p = A:在多维数组中,A表示第一维数组的地址,不是第一个元素的地址;

B、p = A[0]:在二维数组中,指向的是二维数组的第一个元素;

C、p = &A[0][0]:A[0][0]表示二维数组的第一个元素,所以可以p = &A[0][0]。

5、inline函数

因为内联函数是讲比较简单的代码嵌入到类中,避免调用函数产生额外的时间开销,一般用于加快程序执行速度。因为将代码嵌入到类中,所以可能导致可执行文件的变大或者变小。

6、new、malloc

a、都是在堆(heap)上进行动态的内存操作。

b、用malloc函数需要指定内存分配的字节数并且不能初始化对象,new 会自动调用对象的构造函数。

c、delete 会调用对象的destructor,而free 不会调用对象的destructor。

1) malloc 函数: void *malloc(unsigned int size)

在内存的动态分配区域中分配一个长度为size的连续空间。

如果分配成功,则返回所分配内存空间的首地址,否则返回NULL,申请的内存不会进行初始化

2)calloc 函数: void *calloc(unsigned int num, unsigned int size)

按照所给的数据个数和数据类型所占字节数,分配一个 num * size 连续的空间。

calloc申请内存空间后,会自动初始化内存空间为 0,但是malloc不会进行初始化,其内存空间存储的是一些随机数据。

3)realloc 函数: void *realloc(void *ptr, unsigned int size)

动态分配一个长度为size的内存空间,并把内存空间的首地址赋值给ptr,把ptr内存空间调整为size。

申请的内存空间不会进行初始化

4)new是动态分配内存的运算符,自动计算需要分配的空间,在分配类类型的内存空间时,同时调用类的构造函数,对内存空间进行初始化,即完成类的初始化工作。动态分配内置类型是否自动初始化取决于变量定义的位置,在函数体外定义的变量都初始化为0,在函数体内定义的内置类型变量都不进行初始化。

7、C++对空类或者空结构体 ,对其sizeof操作时候,默认都是 1个字节

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-27 08:08:15

C/C++编程细节(二)的相关文章

网络编程(二):戏说非阻塞网络编程

著作权归作者所有. 商业转载请联系作者获得授权非商业转载请注明出处.作者大家可以看我的知乎专栏链接http://zhuanlan.zhihu.com/auxten/20204159这是一个系列的文章之三之四已经写完了会陆陆续续搬到Linuxtone着急的同学可以看 网络编程三从libevent到事件通知机制 网络编程四互联网中TCP Socket服务器的实现过程需要考虑哪些安全问题 在数据加密领域举例子我们经常会提到Alice和Bob我们也继续延续这种传统. 在遥远的1752年的英国电报这种可以

[转帖]脑残式网络编程入门(二):我们在读写Socket时,究竟在读写什么?

脑残式网络编程入门(二):我们在读写Socket时,究竟在读写什么? http://www.52im.net/thread-1732-1-1.html 1.引言 本文接上篇<脑残式网络编程入门(一):跟着动画来学TCP三次握手和四次挥手>,继续脑残式的网络编程知识学习 ^_^. 套接字socket是大多数程序员都非常熟悉的概念,它是计算机网络编程的基础,TCP/UDP收发消息都靠它.我们熟悉的web服务器底层依赖它,我们用到的MySQL关系数据库.Redis内存数据库底层依赖它.我们用微信和别

Linux Shell编程之二选择结构

Shell编程学习之二 一.bash的条件测试 测试方法或者说测试书写: test EXPR [ EXPR ] [[ EXPR ]] 例如:测试变量 User_Name 的之是否为root test $User_Name="root" [ $User_Name == "root" ] [[ $User_Name == "root" ] 根据比较时操作数的类型,测试类型分为: 测试类型 运算符 运算符所代表的意义 示例 整形测试 -gt -lt -

python 网络编程 (二)---tcp

异常 python的socket模块实际上定义了4种可能出现的异常: 1)与一般I/O 和通信问题有关的socket.error; 2)与查询地址信息有关的socket.gaierror; 3)与其他地址错误有关的socket.herror; 4)与在一个socket上调用settimeout()后,处理超时有关的socket.timeout; import socket, sys, time host = sys.argv[1] textport = sys.argv[2] filename

Java之GUI编程(二)——布局管理器

在上篇博客Java之GUI编程(一)中我已经对GUI编程的组件和事件做了简单介绍了,现在来看看另外一部分关于组件在各个平台是如何做到仍能保持自己合理的位置大小以及外观的. 已经说了Java是跨平台运行的,但是不同的平台对于点及坐标的定义不完全相同.而且屏幕的解析度分辨率不同也会造成位置的变化,为了确保每个组件的相对位置和大小以及外观,java就设计了布局管理器. 布局管理器是对容器中的元素进行管理,按照一定的规则排放容器里面的元素.它控制了组件的摆放. 布局管理器分类: FlowLayout:浮

Javascript面向对象编程(二):构造函数的继承

这个系列的第一部分,主要介绍了如何"封装"数据和方法,以及如何从原型对象生成实例. 今天要介绍的是,对象之间的"继承"的五种方法. 比如,现在有一个"动物"对象的构造函数. function Animal(){ this.species = "动物"; } 还有一个"猫"对象的构造函数. function Cat(name,color){ this.name = name; this.color = col

Scala 中的函数式编程基础(二)

主要来自 Scala 语言发明人 Martin Odersky 教授的 Coursera 课程 <Functional Programming Principles in Scala>. 2. Higher Order Functions 把其他函数作为参数或者作为返回值,就是 higher order functions,python 里面也可以看到这样使用的情形.在酷壳上的博客有一个例子就是将函数作为返回值. 2.1 匿名函数 在 python 里边叫 lambda 函数,常常与 map(

POSIX 线程编程(二)线程建立与终止

创建与终止线程 线程的管理常用的API有:pthread_create(thread,attr,start_routine,arg) pthread_exit(status) pthread_cancel(thread) pthread_attr_init(attr) pthread_attr_destroy(attr) 创建线程: 一个main程序包含一个默认的主线程,这个主线程在程序开始运行的时候由系统创建.除此之外的所有其他线程必须由程序员显式的创建. pthread_create 创建一

【UNIX网络编程(二)】基本TCP套接字编程函数

基于TCP客户/服务器程序的套接字函数图如下: 执行网络I/O,一个进程必须做的第一件事就是调用socket函数,指定期望的通信协议类型. #include <sys/socket.h> int socket(int family, int type, int protocol);/*返回值:若成功则为非负描述符,若出错则为-1*/ socket函数成功时返回一个小的非负整数值,它与文件描述符类似,把它称为套接字描述符,简称sockfd.family参数指明协议族,被称为协议域.type参数指

嵌入式 Linux网络编程(二)——TCP编程模型

嵌入式 Linux网络编程(二)--TCP编程模型 一.TCP编程模型 TCP编程的一般模型如下图: TCP编程模型分为客户端和服务器端编程,两者编程流程如下: TCP服务器端编程流程: A.创建套接字: B.绑定套接字: C.设置套接字为监听模式,进入被动接受连接状态: D.接受请求,建立连接: E.读写数据: F.终止连接. TCP客户端编程流程: A.创建套接字: B.与远程服务器建立连接: C.读写数据: D.终止连接. 二.TCP迭代服务器编程模型 TCP循环服务器接受一个客户端的连接