C&C++专项小练(一)

声明:专栏中专项小练题目来源牛客网,若有侵权,联系博主即删除;

专项小练(一)

1 字符型变量说明

//\:不是字符,\\才是
ch = '\';
//ch = 65 对应ASCII中字符A 
ch = 62+3;
//空
ch = NULL;
//表示十六进制字符,“十、八、二进制字符”
ch = '\xaa'

EOF

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++;” 能编译通过

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章