记一点笔试面试的小题目吧
2,对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。
3,因此C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以一个能完成清理与释放内存工作的运算符delete。注意new/delete不是库函数。
4,C++程序经常要调用C函数,而C程序只能用malloc/free管理动态内存。
5、new可以认为是malloc加构造函数的执行。new出来的指针是直接带类型信息的。而malloc返回的都是void指针。
一:new delete 是运算符,malloc,free是函数
malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。它们都可用于申请动态内存和释放内存。
对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。
因此C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以及一个能完成清理与释放内存工作的运算符delete。注意new/delete不是库函数。
2.在C#语言中,重载和重写的区别到底在什么地方?
在C#中我不敢妄言。因为我是用java的,在这个方面二者相差不多,我就说说java吧。
重写一般是指父类和子类之间,子类重写了父类的一个方法,当然方法名是一样的,而且不能改变父类方法的返回值,比如说父类是返回String,子类重写了这个方法,想返回一个int,那是不行的,也得返回String。
重载是一个类里面,写了多了同名的方法,各个方法的返回值类型可以不一样。要注意区分重载方法可以通过参数列表的个数,类型和顺序。但是不推荐用顺序来进行重载,这会让代码可读性极差。
3.分析
int main(){
char str1[]="hello world";
char str2[]="hello world";
char * str3 = "hello world";
char * str4 = "hello world";
if(str1 == str2)
cout<<"str1 = str2"<<endl;
else
cout<<"str1 != str2"<<endl;
if(str3 == str4)
cout<<"str3 == str4"<<endl;
else
cout<<"str3 != str4"<<endl;
return 0;
}
/**
* 结果:
* str1 != str2
str3 == str4
*
* str1 和 str2 是两个字符串,分配了12个字节的存储空间,并把“hello world”的内容复制到数组中去,地址不同
* str3 和 str4 是两个指针,我们无需为他们分配内存及存储字符串的内容,只需要把他们指向"hello world"在内存中的地址就可以了。
* 由于hello world 是常量字符串,他们在内存中只有一个copy,因此他们指向一个相同的地址
*/
4.字符串反转
<span style="font-size:14px;">#include <iostream>
#include <cstring>
using namespace std;
char * reverse(const char *s){
//reverse a string
int len = strlen(s);
char *temp = new char[len];
for(int i=len ;i>=0;--i){
temp[len-i] = s[i-1];
}
return temp;
}
int main(){
char s[] = "hello world";
cout<<s<<endl;
char *t;
t = reverse(s);
cout<<t<<endl;
return 0;
}
//output:
//hello world
//dlrow olleh</span>
5.字符串反转2
(leetcode 1题)Reverse Words in a String
单词的样子不变,但是单词的顺序反转
Given s = "the sky is blue",
return "blue is sky the".
需要考虑的问题:尾部的空格? 2个或多个相邻的空格? 最前面有空格但是你又不能输出的
参考我的leetcode第一题: 点击打开链接
6.const * 与 *const
int num = 500;
const int *a = & num;//指针指向的内容为常量,即“*a = 499"是错的,num的值可以修改
int const *b = & num;//同上
int *const c = & num;//指针c本身是常量,即c指向的内容是常量,”c--;"是错的
const int * const d = & num;//指针本身及其所指向的内容均为常量
/**
* 规则:
* 1.const位于*左侧,则const修饰的是指针所指向的变量,即指针指向一个常量
* 2.const位于*右侧,则const修饰指针本身
*/
int main() {
*a = 499; //error
a++; //ok
*c = 300; //ok
(*c)--; //ok
*c--; //error
return 0;
}
eclipse下outline中的内容:
strcpy和memcpy都是标准C库函数,它们有下面的特点。
strcpy提供了字符串的复制。即strcpy只用于字符串复制,并且它不仅复制字符串内容之外,还会复制字符串的结束符。
已知strcpy函数的原型是:
char* strcpy(char* dest, const char* src);
memcpy提供了一般内存的复制。即memcpy对于需要复制的内容没有限制,因此用途更广。
void *memcpy( void *dest, const void *src, size_t count ); //第三个参数决定长度
8.指针和引用的区别
1.一个引用必须总是指向摸个对象,不可指空
2.使用引用不需要测试合法性,指针应总是检测其合法性
3.指针可以更改指向不同的对象,而引用不可以更改
attention:
1.不能建立引用的数组,因为数组是个地址,他不是一个名副其实的数据类型
2.引用本身不是数据类型
其它:
c++中函数传递方式有3种:
1,,按值传递
2,指针传递
3,引用传递(和指针传递作用相同,引用传递可提高可读性)
引用(reference)不是值,不占内存,是一个别名
引用运算符与地址符相同,但彼此关联
引用运算符只在声明时使用,他放在类型名后面,其它任何 & 的使用都是为地址操作符
引用传递也被用作一种传递大对象的机制,特别对象非常大的时候,按值传递会耗时较多,而引用传递不需要进行复制,比较高效。
在使用引用传递时最好使用const。