声明:专栏中专项小练题目来源牛客网,若有侵权,联系博主即删除;
专项小练(一)
1 字符型变量说明
//\:不是字符,\\才是
ch = '\';
//ch = 65 对应ASCII中字符A
ch = 62+3;
//空
ch = NULL;
//表示十六进制字符,“十、八、二进制字符”
ch = '\xaa'
2 使用VC编译成32位可执行程序,**求类的大小
**
C++标准规定类的大小不为0,空类的大小为1,当类不包含虚函数和非静态数据成员时,其对象大小也为1,所以nLenA和nLenAObject的值为1;
如果在类中声明了虚函数(不管是1个还是多个),那么在实例化对象时,编译器会自动在对象里安插一个指针指向虚函数表VTable,在32位机器上,一个对象会增加4个字节来存储此指针,它是实现面向对象中多态的关键。因此,LenB和nLenBObject的值为4;
对于普通继承,派生类和基类共享虚函数指针,派生类对象的存储空间=基类存储空间+派生类特有的非static数据成员的空间,由于t_classA为空类,t_classB和t_classC共享虚函数指针,因此LenC和nLenCObject的值为4;
3 关键字const和static声明变量
static变量连接期被分配到了data段,即使是在函数调用中定义也不会在栈中产生,而是在程序加载期就被加入了内存;
const表面含义是个常量,但实际上还是占据一个内存位置的变量,但是它的值一般实在编译时期就决定了;
注:static变量内存分配、const
4 关于new的理解
new创建的对象需要使用delete进行释放;
- new创建对象不一定需要定义初始值;
- new会调用构造函数;
- new可以用来创建对象和对象数组,且调用构造函数;
5 在一个vector中查找匹配值value并删除
for (std::vector::iterator iter = numbers.begin(); iter != numbers.end(); )
{
if (*iter ==value)
{
iter = numbers.erase(iter);
}
else
{
++iter;
}
}
测试
#include<iostream>
#include<vector>
using namespace std;
int main(){
// vector<int> numbers(10);
vector<int> numbers;
numbers.push_back(1);
numbers.push_back(2);
numbers.push_back(3);
numbers.push_back(4);
for(vector<int>::itertor it = numbers.begin();it!=numbers.end();++it)
cout<<*it<<" "
int value = 2;
for (vector<int>::iterator iter = numbers.begin(); iter != numbers.end(); ++iter)
{
if (*iter ==value)
{
numbers.erase(iter);
cout<<*iter<<endl;
iter--;
cout<<*iter<<endl;
}
}
return 0;
}
1 2 3 4
3
1
在利用迭代器遍历元素并删除后,迭代器会自动指向该元素的后一位置;
iter--;//为了抵消for循环中++iter,没有遍历全部元素位置,
迭代器遍历容器元素,找到元素值为2对应位置并删除,自动返回下一个元素的位置,并接着遍历后续元素;
若value值为容器的第一个元素,则该程序出错:
1 2 3 4
2
268468064
修改为:
for (vector<int>::iterator iter = numbers.begin(); iter != numbers.end(); ++iter)
{
if (*iter ==value)
{
cout<<*iter<<endl;
numbers.erase(iter);
if(iter!=numbers.begin()){
iter--;
cout<<*iter<<endl;
}
}
}
6 类中虚函数、静态成员函数调用
b->FunctionB();//用法错误
虚函数本质上是通过类对象的虚表进行访问,而且类的成员函数除了虚函数,其他都不存储在类当中,因此类对象不存在的情况下,无法使用虚函数,其他函数都可以正常访问(前提是这些函数都没有存取类对象的成员变量)
重载(overload)和重写(override)的区别?
重载:是指允许存在多个同名函数,而这些函数的参数表不同;
重写:是指子类重新定义复类虚函数的方法;
7 继承中访问控制
公用(public):访问权限最高;除派生类外,外部函数也可以直接访问(无论是成员变量还是成员函数)。;
私有(private):访问权限最低;只能是该类内部函数互相调用,派生类、外部函数都不能访问;
保护(protect):访问权限中间;该类内部函数、派生类都能访问,外部类、外部函数不能访问 ;
基类中的private成员在派生类中是不可被访问的,并不是private的。
8 函数用法
当键盘输入20,程序的运行结果是15
#include <iostream>
#include <vector>
using namespace std;
int main()
{ vector<int> A(10);
int count=0,n;
cout<<"请输入n的值:";
cin>>n;
A.__________(n);
for(int i=2;i<=n;i++)
if(i%3==0&&i%5==0) A[count++]=i;
for(i=0;i<count;i++)
cout<<A[i]<<" ";
cout<<endl;}
reserve(n)
调用reserve(n)后,若容器的capacity<n,则重新分配内存空间,从而使得capacity等于resize(n);
调整容器的长度大小,使其能容纳n个元素。如果n小于容器的当前的size,则删除多出来的元素。否则,添加采用值初始化的元素;
原来容器大小是10,I=15才会有A[count++]=15,所以要调整大小;
reserve
std::reverse
template
void reverse (BidirectionalIterator first, BidirectionalIterator last);
Reverses the order of the elements in the range [first,last).
The function calls iter_swap to swap the elements to their new locations.
The behavior of this function template is equivalent to:
大意如下:
反转范围内元素的顺序[frist,last]
函数调用iter_swap将元素交换到它们的新位置;
此函数模板的功能等效于:
template <class BidirectionalIterator>
void reverse (BidirectionalIterator first, BidirectionalIterator last)
{
while ((first!=last)&&(first!=--last)) {
std::iter_swap (first,last);
++first;
}
}
9 C语言中数据存储形式
- 负数在内存中存储的是补码形式
- 正数在内存中以原码形式存储
- 浮点数是采用某种规则转换后存储
- char型是直接将其对应的ASCII码存储
10 关于printf用法?
int x;
x = printf("I See, Sea in C");
printf("x=%d", x);
//I See, Sea in Cx=15
int printf ( const char * format, … );返回值:
正确返回输出的字符总数(不包括后面的‘\0’),错误返回负值,与此同时,输入输出流错误标志将被置值,可由指示器ferror来检查输入输出流的错误标志。
使用printf函数打印一个double类型的数据,要求:输出为10进制,输出左对齐30个字符,4位精度
%-30.4f
-: 左对齐
30: 最小字段宽度
.4: 精确度保留小数4位
f: double精度浮点数
e: 科学计数法
C Primer Plus指出:printf()的转换说明修饰符可在%和定义转换发之间通过插入修饰符对基本的转换说明加以修改。
用于打印浮点类型的转换说明符double和long double,但没有用于float的说明符,因为在K&R C中float值在被用于表达式中或者被用作参数之前,会被自动转换为double类型。一般情况下,ANSI C不会自动将float转换为double。
看个例子
/*with.c--字段宽度*/
#include<stdio.h>
#define PAGES 931
int main(void){
printf("*%d*\n",PAGES);
printf("*%2d*\n",PAGES);
printf("*%10d*\n",PAGES);
printf("*%-10d*\n",PAGES);
return 0;
}
程序输出结果为
*931*
*931*
* 931*
*931 *
asd
//float.c ---一些浮点数
#include<stdio.h>
int main(void){
const double RENT = 3852.99;//以const方法定义的常量
printf("*%f*\n",RENT);
printf("*%e*\n",RENT);
printf("*%4.2f*\n",RENT);
printf("*%3.1f*\n",RENT);
printf("*%10.3f*\n",RENT);
printf("*%10.3e*\n",RENT);
printf("*%+4.2f*\n",RENT);
printf("*%010.2f*\n",RENT);
return 0;
}
*3852.990000*
*3.852990e+003*
*3852.99*
*3853.0*
* 3852.990*
*3.853e+003*
*+3852.99*
*0003852.99*
+标志使得结果数字和它的代数符号一起打印,在这里该符号就是加号符号;0标志产生前导零以使结果填充整个字段;
请注意,在说明符%010中第一个0是一个标志,剩余的数字(10)指定字段宽度。
11 十进制转八进制方法
#include<iostream>
#include<stdio.h>
using namespace std;
int main(){
int m=0123, n = 123;//八进制为0...(0-7)
printf("%o %o\n", m, n);
return 0;
}
12 sizeof和strlen
设语句定义char a[ 80 ]= " 0123\0789 "; ,则sizeof(a)和strlen(a)的值分别为
char a[80]=" 0123\0789 "; sizeof(a) = 80;
空格 0 1 2 3 \07 8 9 \0 ; strlen(a) = 9;
//64位系统中
const char *str = "123456";
printf("sizeof(str):%d\n",sizeof(str));
printf("strlen(str):%d\n",strlen(str));
/*
sizeof(str):8
strlen(str):6
*/
sizeof(str)读的是地址大小,在64系统地址为64位,就8B;32位系统4B,一个字节为8bit;
sizeof用法查询对象或类型的大小,得到对象的实际大小;
sizeof(类型);//(1)返回类型的对象表示的字节大小
sizeof(表达式);//(2)返回表达式类型的对象表示的字节大小
注意
取决于计算机架构,字节可能由 8 或更多位构成,准确数作为 CHAR_BIT 所提供。
sizeof(char) 、 sizeof(signed char) 和 sizeof(unsigned char) 始终返回 1 。
sizeof 不能用于函数类型、不完整类型(含void)或位域左值。
应用 sizeof 到 结构体或联合体类型运算数时,结果是这种对象中的总字节数,包含内部和尾随填充。尾随填充使得若对象在数组中,则此数组中下个元素的对齐要求会得到满足,换言之, sizeof(T) 返回 T[] 数组中元素的大小。
strlen
13 数据类型和数组结合
#define MAX 255
int main()
{
unsigned char A[MAX], i;
for (i = 0; i <= MAX; i++)
A[i] = i;
unsigned char 类型大小
数组越界
死循环
unsigned char类型的范围是0-255,所以当循环执行到255时,再加1将变成0,从而再次循环。
C++不进行数组越界检查
14 字符逆序
int main()
{
char *src = "hello,world";
int len = strlen(src);
char *dest = (char *)malloc(len + 1); //要为\0分配一个空间
char *d = dest;
char *s = &src[len - 1]; //指向最后一个字符
while ( len-- != 0 )
*d++ = *s--;
*d = 0; //尾部要加\0
printf("%s\n", dest);
free(dest);// 使用完,应当释放空间,以免造成内存汇泄露
return 0;
}
15 数组指针和指针数组
数组指针:指针变量指向数组
指针数组:数组内每个元素有指针变量,每个元素为指向某种类的元素;
typedef char T[10] ; //T 为一个字符数组,这里为什么要加typedef?
T * a ; //a表示指向字符数组的一个指针变量
//等价于:
char (*a)[10];//a为指针变量,指向一个具有10个元素的字符数组
char *a[10];//a表示一个数组,即数组内存放元素为指针变量? 每个元素都是指针变量,每个指针指向一个char变量?
In C++, what does “explicit” mean? what does “protected” mean?
answer
c语言中,语句 “if(i=1) i++;” 能编译通过