1.C++有哪些数据类型?为什么long和int都是4字节?
C++的数据类型有字符型(char)、布尔型(bool)、短整型(short)、整型(int)、长整型(long)、浮点型(float)、双精度型(double)等类型
首先并不是所有的long和int都是4字节的,在C++中规定int的长度是大于等于short的长度,小于等于long的长度,并且要大于2字节,在16位CPU以及单片机中,int是2字节的,而在32位CPU及以上的CPU中int是4字节的;
在C++中long的长度应该是大于等于int的长度,且最小为4字节,在32位CPU中long为4字节,在64位机上long为8字节长度
2.JAVA和C++的区别是什么?分别用在什么情景比较好?
Java 和 C++ 都是面向对象的语言,但他们也存在着一些区别
1、Java 不支持多继承
2、Java 没有指针和引用
3、c++ 需要程序员手动管理堆内存,Java有自动垃圾回收机制
Java运行在java虚拟机上,速度相对较慢,在实时性要求高的场合应该用c++
java通常在手机上应用的比较多。
JAVA和C++的区别是:
1 JAVA对内存的分配是动态的,它采用面向对象的机制,使用new为每个对象分配内存,程序运行过程中JAVA系统自动对内存进行扫描,对长期不用的空间作为“垃圾”进行收集,使得系统资源得以充分利用。 而C++使用new和delete来分配内存,内存的处理需要程序员自己来释放,如果对已释放的内存再释放或者对未内分配的内存做释放,都会造成死机,如果对长期不用或不再使用的内存长期不释放,造成资源的浪费。
2 JAVA不 在所有类之外定义全局变量,而是在某个类中定义一种公共静态的变量来完成全局变量的功能;
3 JAVA不支持头文件,而C++使用头文件来定义类的原型、全局变量、库函数等;
4 JAVA不支持宏定义,使用关键字final来定义常量,在C++中则采用宏定义来实现常量定义
5 JAVA对每种数据类型都分配固定长度,而C++中对于不同平台,同一种类型分配不同的字节数
6 类型转换不同,JAVA在运行时系统对对象的处理要进行类型相容性检查,以防止不安全类型的转换,而C++中可以通过指针进行任意类型转换,常常带来不安全性。
7 结构和联合的处理不同,C++中结构和联合的所有成员均为公有,这就带来了安全性问题,而在JAVA中根本不存在结构和联合,所有的内容都封装在类里面。
8 JAVA不再使用指针,而C++中指针使用最灵活,蛋液最容易产生错误的数据类型,由指针多进行的内存地址操作常会造成不可预知的错误,同事通过指针对某个内存地址进行显示类型转换后,可以访问一个C++中的私有成员,从而破坏安全性,而JAVA对指针进行完全控制,程序员不能进行任何指针操作。
3.编程题:给定一个文件每一行是字符串,找出所有的逆序对,比如abc和cba是逆序的对。
#include"iostream"#include"string"#define MAX 100using namespace std;bool check(string str1,string str2){ bool flag = true; for(int i=0; i<str1.length(); i++) { if(str1[i]!=str2[str1.length()-1-i]) { flag = false; return flag; } } return flag;}int main(int argc, char* argv[]){ string str[MAX]; int n,a[MAX]; bool flag[MAX]; cin>>n; for(int i=0; i<n; i++) { cin>>str[i]; a[i] = str[i].length(); flag[i] = true; } int num = 0; for(int i=0; i<n; i++) { int len = a[i]; if(flag[i]==true) { for(int j=0;j<n;j++) { if(flag[j]==true&&len==a[j]) { if(check(str[i],str[j])) { num++; flag[i] = false; flag[j] = false; break; } } } } } for(int i=0; i<n; i++) cout<<str[i]<<‘\t‘; cout<<endl; cout<<"The Number of Matched String Is: "<<num<<endl; return 0;}
4.给定一个奇数n,比如n=3,生成1到n平方的数,如1到9,填入九宫格,使得横竖斜的和都相等。
void shudu() { const int n=3; int a[n][n]={0}; int i,j; i=0; j=n/2; a[i][j]=1; for(int c=2;c<=n*n;c++) { if (i-1>=0&&j+1<n) { if (a[i-1][j+1]==0) { i=i-1; j=j+1; } else { i=i+1; } } else { if (i-1<0&&j+1>=n) { i=i+1; } else { if (j+1>=n) { i=i-1; j=j+1-n; } else { j=j+1; i=i-1+n; } } } a[i][j]=c; } for (i=0;i<n;i++) { for (j=0;j<n;j++) { std::cout<<a[i][j]<<" "; } std::cout<<std::endl; } } |
5.C和C++有什么区别,能用C实现C++所有功能吗?C能实现多态吗?
原本的作业是批处理,也就是过程编程。缺点是不利于代码修改和重用。为了解决这个问题,出现了C语言的函数,实现结构化编程。
随着项目愈发的庞大,函数与函数间的逻辑关系愈发复杂,不利修改。另外,算法中逻辑步骤是一样的,但针对不同的数据类型,需要重写一遍。为了解决这个问题,出现了C++语言的class,实现面向对象编程。以及C++语言的模板,实现范式编程。
所以C实现结构化编程,C++实现结构化编程、面向对象编程和范式编程。
C++实现面向对象编程和范式编程,背后需要编译器提供相应的机制支持。这个机制支持本质是逻辑的,理论上,C语言能够模拟这套机制,也就是说理论上用C实现C++所有功能。但工作量会特别大,即实用角度看,用C不能实现C++所有功能。
C能实现多态。C++实现多态,是建一个表格,存储多态相关的函数指针,运行时根据调用对象的类型选择相应的函数。C语言可以模拟这个原理实现多态。
C是一个结构化语言,它的重点在于算法和数据结构。C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到输出(或实现过程(事务)控制),而对于C++,首要考虑的是如何构造一个对象模型,让这个模型能够契合与之对应的问题域,这样就可以通过获取对象的状态信息得到输出或实现过程(事务)控制。
对语言本身而言,C是C++的子集, C实现了C++中过程化控制及其它相关功能,而在C++中的C,相对于原来的C还有所加强,引入了重载、内联函数、异常处理等等,C++更是拓展了面向对象设计的内容,如类、继承、虚函数、模板和包容器类等等。
要用C模拟C++的多态性,可定义同一种函数指针类型和函数指针,运行过程中根据需要给函数指针赋函数地址。可以使用void *实现。
6.请用c++ 实现stl中的string类,实现构造,拷贝构造,析构,赋值,比较,字符串相加,获取长度及子串等功能。
#include <iostream>#include <cstring>using namespace std; class String{public: // 默认构造函数 String(const char* str = NULL); // 复制构造函数 String(const String &str); // 析构函数 ~String(); // 字符串连接 String operator+(const String & str); // 字符串赋值 String & operator=(const String &str); // 字符串赋值 String & operator=(const char* str); // 判断是否字符串相等 bool operator==(const String &str); // 获取字符串长度 int length(); // 求子字符串[start,start+n-1] String substr(int start, int n); // 重载输出 friend ostream & operator<<(ostream &o,const String &str);private: char* data; int size;};// 构造函数String::String(const char *str){ if(str == NULL){ data = new char[1]; data[0] = ‘\0‘; size = 0; }//if else{ size = strlen(str); data = new char[size+1]; strcpy(data,str); }//else}// 复制构造函数String::String(const String &str){ size = str.size; data = new char[size+1]; strcpy(data,str.data);}// 析构函数String::~String(){ delete[] data;}// 字符串连接String String::operator+(const String &str){ String newStr; //释放原有空间 delete[] newStr.data; newStr.size = size + str.size; newStr.data = new char[newStr.size+1]; strcpy(newStr.data,data); strcpy(newStr.data+size,str.data); return newStr;}// 字符串赋值String & String::operator=(const String &str){ if(data == str.data){ return *this; }//if delete [] data; size = str.size; data = new char[size+1]; strcpy(data,str.data); return *this;}// 字符串赋值String& String::operator=(const char* str){ if(data == str){ return *this; }//if delete[] data; size = strlen(str); data = new char[size+1]; strcpy(data,str); return *this;}// 判断是否字符串相等bool String::operator==(const String &str){ return strcmp(data,str.data) == 0;}// 获取字符串长度int String::length(){ return size;}// 求子字符串[start,start+n-1]String String::substr(int start, int n){ String newStr; // 释放原有内存 delete [] newStr.data; // 重新申请内存 newStr.data = new char[n+1]; for(int i = 0;i < n;++i){ newStr.data[i] = data[start+i]; }//for newStr.data[n] = ‘\0‘; newStr.size = n; return newStr;}// 重载输出ostream & operator<<(ostream &o, const String &str){ o<<str.data; return o;}