首页 > 编程语言 >C++的习题

C++的习题

时间:2024-09-15 20:21:21浏览次数:10  
标签:函数 int 成员 C++ static new 习题

C++的习题

在这里插入图片描述

类与对象

习题1:(const成员函数)

假设 AA 是一个类, AA* abc () const 是该类的一个成员函数的原型。若该函数返回 this 值,当用 x.abc ()调用该成员函数后, x 的值是( )

A.可能被改变

B.已经被改变

C. 受到函数调用的影响

D.不变

A.此成员函数被定义为const常方法,代表在函数内部不能修改任何当前对象的数据成员,因此x不可能改变

B.错误,不能被改变

C.x的值在函数内部不受任何影响

D.正确

习题2:(初始化列表)

有一个类A,其数据成员如下: 则构造函数中,成员变量一定要通过初始化列表来初始化的是:( )

class A {

private:

int a;

public:

const int b;

float* &c;

static const char* d;

static double* e;

};

A.a b c

B.b c

C.b c d e

D.b c d

E.b

F.c

A.a是不同数据成员,可以通过构造函数进行赋值

B.正确,常量以及引用只能通过初始化列表初始化

C.d,e是静态成员,只能在类外初始化

D.d是静态成员,只能在类外初始化

E.b常量只能通过初始化列表初始化,但不是最佳答案

F.c引用只能通过初始化列表初始化,但不是最佳答案

习题3:(类型转换)

下面程序的运行结果是( )?

class A

{

public:

A(int a)

:_a1(a)

,_a2(_a1)

{}

void Print()

{

cout<<_a1<<" "<<_a2<<endl;

}

private:

int _a2;

int _a1;

}

int main()

{

A aa(1);

aa.Print();

}

A.输出1 1

B.程序崩溃

C.编译不通过

D.输出1 随机值

A.初始化顺序由定义类时的声明顺序决定,所以先初始化_a2,由于初始化_a2时_a1还未初始化,所以为随机值,故错误

B.程序正常运行

C.能编译通过

D.正确

习题4:(static)

在一个cpp文件里面,定义了一个static类型的全局变量,下面一个正确的描述是:( )

A.只能在该cpp所在的编译模块中使用该变量

B.该变量的值是不可改变的

C.该变量不能在类的成员函数中引用

D.这种变量只能是基本类型(如int,char)不能是C++类型

A.正确,static限制了变量具有文件域

B.static变量是可以被改变的

C.可以被正常访问使用,以及通过成员来进行引用

D.静态变量也可以是自定义类型的变量

习题5:(static成员和对象成员)

关于C++类中static 成员和对象成员的说法正确的是( )

A.static 成员变量在对象构造时生成

B.static 成员函数在对象成员函数中无法调用

C.static 成员函数没有this指针

D.static 成员函数不能访问static 成员变量

A.static成员变量在对象生成之前生成

B.普通成员函数是可以调用static函数的

C.static函数属于所有对象共享,不具备this指针

D.static函数唯一能够访问的就是static变量或者其他static函数

习题6:(友元函数)

下面程序段包含4个函数,其中具有隐含this指针的是( )

int f1();

class T

{

public:static int f2();

private:friend int f3();

protect:int f4();

};

A.f1

B.f2

C.f3

D.f4

A.全局函数不具备this指针

B.static函数不具备this指针

C.友元函数不具备this指针

D.正确,普通成员方法具有隐藏的this指针

A.static成员变量在对象生成之前生成

B.普通成员函数是可以调用static函数的

C.static函数属于所有对象共享,不具备this指针

D.static函数唯一能够访问的就是static变量或者其他static函数

习题7:(友元函数)

下面有关友元函数与成员函数的区别,描述错误的是?( )

A.友元函数不是类的成员函数,和普通全局函数的调用没有区别

B.友元函数和类的成员函数都可以访问类的私有成员变量或者是成员函数

C.类的成员函数是属于类的,调用的时候是通过指针this调用的

D.友元函数是有关键字friend修饰,调用的时候也是通过指针this调用的

A.友元函数不是类的成员函数,就相当于你的朋友再亲密也不是你的家人,既然不是类成员函数,那和普通成员函数调用一样,不需要通过对象调用

B.友元的目的就是为了访问类的私有数据,成员函数可以直接访问类的私有数据

C.类的成员函数属于类,调用时其内部数据会通过this指针来调用

D.友元函数不具备this指针,更谈不上通过this调用,故错误

习题8:(友元函数)

一个类的友元函数能够访问类的( )

A.私有成员

B.保护成员

C.公有成员

D.所有成员

A.可以访问,这也是把一个函数声明为友元的目的

B.可以访问

C.可以访问

D.友元函数对一个类里面的所有成员,全部通吃,正确

C/C++内存管理

习题1:

int globalVar = 1;

static int staticGlobalVar = 1;

void Test()

{

​ static int staticVar = 1;

​ int localVar = 1;

​ int num1[10] = {1, 2, 3, 4};

​ char char2[] = “abcd”;

​ char* pChar3 = “abcd”;

​ int* ptr1 = (int*)malloc(sizeof (int)*4);

​ int* ptr2 = (int*)calloc(4, sizeof(int));

​ int* ptr3 = (int*)realloc(ptr2, sizeof(int)*4);

​ free (ptr1);

​ free (ptr3);

}

  1. 选择题:

选项: A.栈 B.堆 C.数据段(静态区) D.代码段(常量区)

globalVar在哪里?____ staticGlobalVar在哪里?____

staticVar在哪里?____ localVar在哪里?____

num1 在哪里?____

char2在哪里?____ *char2在哪里?___

pChar3在哪里?____ *pChar3在哪里?____

ptr1在哪里?____ *ptr1在哪里?____

  1. 填空题:

sizeof(num1) = ____;

sizeof(char2) = ____; strlen(char2) = ____;

sizeof(pChar3) = ____; strlen(pChar3) = ____;

sizeof(ptr1) = ____;

  1. 选择题:

选项: A.栈 B.堆 C.数据段(静态区) D.代码段(常量区)

globalVar在哪里?C staticGlobalVar在哪里?C

staticVar在哪里?C localVar在哪里?A

num1 在哪里?A

分析:

globalVar全局变量在数据段 staticGlobalVar静态全局变量在静态区

staticVar静态局部变量在静态区 localVar局部变量在栈区

num1局部变量在栈区

char2在哪里?A *char2在哪里?A

pChar3在哪里?A *pChar3在哪里?D

ptr1在哪里?A *ptr1在哪里?B

分析:

char2局部变量在栈区

char2是一个数组,把后面常量串拷贝过来到数组中,数组在栈上,所以*char2在栈上

pChar3局部变量在栈区 *pChar3得到的是字符串常量字符在代码段

ptr1局部变量在栈区 *ptr1得到的是动态申请空间的数据在堆区

  1. 填空题:

sizeof(num1) = 40;//数组大小,10个整形数据一共40字节

sizeof(char2) = 5;//包括\0的空间

strlen(char2) = 4;//不包括\0的长度

sizeof(pChar3) = 4;//pChar3为指针

strlen(pChar3) = 4;//字符串“abcd”的长度,不包括\0的长度

sizeof(ptr1) = 4;//ptr1是指针

习题2:(c++内存分配堆栈)

下面有关c++内存分配堆栈说法错误的是( )

A.对于栈来讲,是由编译器自动管理,无需我们手工控制;对于堆来说,释放工作由程序员控制

B. 对于栈来讲,生长方向是向下的,也就是向着内存地址减小的方向;对于堆来讲,它的生长方向是向上的,是向着内存地址增加的方向增长

C.对于堆来讲,频繁的 new/delete 势必会造成内存空间的不连续,从而造成大量的碎片,使程序效率降低。对于栈来讲,则不会存在这个问题

D.一般来讲在 32 位系统下,堆内存可以达到4G的空间,但是对于栈来讲,一般都是有一定的空间大小的

A.栈区主要存在局部变量和函数参数,其空间的管理由编译器自动完成,无需手动控制,堆区是自己申请的空间,在不需 要时需要手动释放

B.栈区先定义的变量放到栈底,地址高,后定义的变量放到栈顶,地址低,因此是向下生长的,堆区则相反

C.频繁的申请空间和释放空间,容易造成内存碎片,甚至内存泄漏,栈区由于是自动管理,不存在此问题

D.32位系统下,最大的访问内存空间为4G,所以不可能把所有的内存空间当做堆内存使用,故错误

习题3:(堆和栈)

C++中关于堆和栈的说法,哪个是错误的:( )

A.堆的大小仅受操作系统的限制,栈的大小一般较小

B.在堆上频繁的调用new/delete容易产生内存碎片,栈没有这个问题

C.堆和栈都可以静态分配

D.堆和栈都可以动态分配

A.堆大小受限于操作系统,而栈空间一般有系统直接分配

B.频繁的申请空间和释放空间,容易造成内存碎片,甚至内存泄漏,栈区由于是自动管理,不存在此问题

C.堆无法静态分配,只能动态分配

D.栈可以通过函数_alloca进行动态分配,不过注意,所分配空间不能通过free或delete进行释放

习题4:(自定义类型的内存管理)

ClassA *pclassa=new ClassA[5];

delete pclassa;

c++语言中,类ClassA的构造函数和析构函数的执行次数分别为( )

A.5,1

B.1,1

C.5,5

D.程序可能崩溃

A.申请对象数组,会调用构造函数5次,delete由于没有使用[],此时只会调用一次析构函数,但往往会引发程序崩溃

B.构造函数会调用5次

C.析构函数此时只会调用1次,要想完整释放数组空间,需要使用[]

D.正确

习题5:(堆和栈)

函数参数使用的空间是在()中申请的,malloc或new是在()中申请空间的?()

A.堆,栈

B.栈,堆

C.栈, 栈

D.堆,堆

A.参数在栈空间存放,malloc或new申请的空间为堆区

B.正确

C.参数在栈空间存放,malloc或new申请的空间为堆区

D.参数在栈空间存放,malloc或new申请的空间为堆区

习题6:(malloc和new的区别)

下面有关malloc和new,说法错误的是? ( )

A.new 是创建一个对象(先分配空间,再调构造函数初始化), malloc分配的是一块内存

B.new 初始化对象,调用对象的构造函数,对应的delete调用相应的析构函数,malloc仅仅分配内存,free仅仅回收内存

C.new和malloc都是保留字,不需要头文件支持

D.new和malloc都可用于申请动态内存,new是一个操作符,malloc是是一个函数

A.new会申请空间,同时调用构造函数初始化对象,malloc只做一件事就是申请空间

B.new/delete与malloc/free最大区别就在于是否会调用构造函数与析构函数

C.需要头文件malloc.h,只是平时这个头文件已经被其他头文件所包含了,用的时候很少单独引入,故错误

D.new是操作符,malloc是函数

习题7:(new)

设已经有A,B,C,D4个类的定义,程序中A,B,C,D析构函数调用顺序为? ( )

C c;

void main()

{

A*pa=new A();

B b;

static D d;

delete pa;

}

A.A B C D

B.A B D C

C.A C D B

D.A C B D

分析:首先手动释放pa, 所以会先调用A的析构函数,其次会跟定义相反的顺序释放局部对象,这里只有b,就释放b,再释放静态局部对象d,再释放全局对象c

习题8:(内置类型的内存管理)

使用 char* p = new char[100]申请一段内存,然后使用delete p释放,有什么问题?( )

A.会有内存泄露

B.不会有内存泄露,但不建议用

C.编译就会报错,必须使用delete []p

D.编译没问题,运行会直接崩溃

A.对于内置类型,此时delete就相当于free,因此不会造成内存泄漏

B.正确

C.编译不会报错,建议针对数组释放使用delete[],如果是自定义类型,不使用方括号就会运行时错误

D.对于内置类型,程序不会崩溃,但不建议这样使用

习题9:(new和delete的次数问题)

以下代码中,A 的构造函数和析构函数分别执行了几次: ( )

A*pa=new A[10];

delete []pa;

A.1、1

B.10、10

C.1、10

D.10、1

A.申请数组空间,构造函数调用的次数就是数组的大小

B.正确

C.申请数组空间,构造函数调用的次数就是数组的大小

D.如果释放数组空间,delete使用了[],则会对应的调用数组大小次数的析构函数

编程题

求1+2+3+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)

代码如下:

class Sum
{
public:
Sum()
{
_ret += _i;
++_i;
}
static int GetRet()
{
return _ret;
}
private:
static int _i;
static int _ret;
};
int Sum::_i = 1;
int Sum::_ret = 0;
class Solution {
public:
int Sum_Solution(int n) {
// 变⻓数组
Sum arr[n];
return Sum::GetRet();
}
};

标签:函数,int,成员,C++,static,new,习题
From: https://blog.csdn.net/Mr_Xuhhh/article/details/142288324

相关文章

  • C++中对象的延迟构造
    本文并不讨论“延迟初始化”或者是“懒加载的单例”那样的东西,本文要讨论的是分配某一类型所需的空间后不对类型进行构造(即对象的lifetime没有开始),更通俗点说,就是跳过对象的构造函数执行。使用场景我们知道,不管是定义某个类型的对象还是用operatornew申请内存,对象的构造函数都......
  • C++ typedef 类型别名注意的地方
    指针、常量和类型别名如果某个类型别名指代的是复合类型或常量,那么把它用到声明语句里就会产生意想不到的后果。例如下面的声明语句用到了类型pstring,它实际上是类型char*的别名typedefchar*pstring;constpstringcstr=0;//cstr是指向char的常量指针constpstring*ps;......
  • 引言 -- 1.6 习题
    计算机系统可划分为哪几个层次,各层次之间的界面是什么?你认为这样划分层次的意义何在?在三台不同指令系统的计算机上运行同一程序P时,A机器需要执行1.0×10^9条指令,B机器需要执行2.0×10^9条指令,C机器需要执行3.0×10^9条指令,但三台机器的实际执行时间都是100秒。请分别计......
  • 矩阵连乘(动态规划)(C/C++)最详尽代码注释
    写在所有的前面:本文采用C/C++实现代码目录写在所有的前面:题目说明题目题目出处题目描述Description输入Input输出Output样例Sample限制Hint解答说明方案1:最优分隔点法(动态规划)解题思路代码实现c语言头文件:c++头文件主代码部分:(详尽版本1)主代码部分(题目对应版本)其他解......
  • C++链接的那些事
    接上文OK!Rightnow!  Let's go!今天我们来谈谈链接,什么是链接,C++链接实际上做什么的?链接是一个过程,当我们从源C++文件转到实际的可执行文件(二进制文件)。第一阶段是编译源文件,一旦我们把文件编译好,就需要通过一个叫做链接的过程,现在链接的主要工作是找到每个符号和......
  • C++编译 链接 执行那些事
    OK!Rightnow!  Let's go!如何从源文件开始,实际的文本文档到可执行的二进制代码,写C++程序的基本流程。实际是你有一些C++的源文件,然后将这些源文件给到编译器,编译器将其转成二进制的东西,二进制的东西可能是某种库,或者是可执行的程序。在#符号之后的都是预处理语句......
  • 「数组」堆排序 / 大根堆优化(C++)
    目录概述核心概念:堆堆结构数组存堆思路算法过程up()down()Code优化方案大根堆优化Code(pro)复杂度总结概述在「数组」快速排序/随机值优化|小区间插入优化(C++)中,我们介绍了三种基本排序中的冒泡排序与分治思想结合的算法:快速排序。本文我们来讲第二种基本排......
  • 详解c++多态---上
    virtual关键字1.可以修饰原函数,为了完成虚函数的重写,满足多态的条件之一。classPerson{public:virtualvoidBuyTicket(){cout<<"买票-全价"<<endl;}};classStudent:publicPerson{public:virtualvoidBuyTicket(){cout<<"买票-半价"<<......
  • c++走出迷宫改良版2
    本文对上期做了删改话不多说上代码:注彩色输出部分代码出自博主夜若渊#include<bits/stdc++.h>#include<windows.h>#include<stdlib.h>#include<cstdio>#include<iostream>#include<string>#include<stdio.h>#include<ctime>#include<conio.h&g......
  • 深入解析C++函数指针:掌握游戏开发中的关键技术
    深入解析C++函数指针:掌握游戏开发中的关键技术C++作为一门经典的编程语言,因其强大的性能和灵活性,被广泛应用于游戏开发。而函数指针作为C++中的一个重要概念,在游戏开发中更是扮演着不可或缺的角色。对于想要深入掌握C++并在游戏开发领域站稳脚跟的开发者来说,理解并灵活运用函数指......