C++ 为什么类和main()函数中也有动态内存分配 #包括 #包括 使用名称空间std; 班级员工 { 私人: char*名字; char*lastName; 静态整数计数; 公众: 员工(常量字符*常量第一,常量字符*常量最后){ firstName=新字符[strlen(first)+1]; strcpy(firstName,first); lastName=新字符[strlen(last)+1]; strcpy(lastName,last); 计数++; cout
很简单。C++ 为什么类和main()函数中也有动态内存分配 #包括 #包括 使用名称空间std; 班级员工 { 私人: char*名字; char*lastName; 静态整数计数; 公众: 员工(常量字符*常量第一,常量字符*常量最后){ firstName=新字符[strlen(first)+1]; strcpy(firstName,first); lastName=新字符[strlen(last)+1]; strcpy(lastName,last); 计数++; cout,c++,memory,dynamic,allocation,C++,Memory,Dynamic,Allocation,很简单。newemployee(“Ahmad”,“Ali”)为Employee类和new char[strlen(first)+1]分配内存并初始化一个实例;在类内分配一个字符串 这是可怕的C++代码。你应该直接管理内存,而不是使用类来帮助你。这些被称为智能指针,并且会根据需要自动分配、初始化、销毁和释放。手工管理原始指针是容易出错的,也是不必要的。记住:编写的代码越少,HAV越少。查找可能的错误 因此, Employee*e1Ptr=新员工(“艾哈迈德”、“阿里”); 你会用 std::un
newemployee(“Ahmad”,“Ali”)
为Employee
类和new char[strlen(first)+1]分配内存并初始化一个实例;
在类内分配一个字符串
<>这是可怕的C++代码。你应该直接管理内存,而不是使用类来帮助你。这些被称为智能指针,并且会根据需要自动分配、初始化、销毁和释放。手工管理原始指针是容易出错的,也是不必要的。记住:编写的代码越少,HAV越少。查找可能的错误
因此,
Employee*e1Ptr=新员工(“艾哈迈德”、“阿里”);
你会用
std::unique_ptr e1Ptr=std::make_unique(“艾哈迈德”、“阿里”);
或
auto e1Ptr=std::使_独一无二(“Ahmad”、“Ali”);
然后放下删除
另外,您可以使用std::string
,而不是分配字符串
char*firstName=新字符[strlen(first)+1];
strcpy(firstName,first);
你会用
std::string firstName=first;
(也掉了<代码>删除[]/COD>)< C.C++是完全不同的语言。没有任何需要……这只是糟糕的编程……Ps:<代码>主< /Cord>需要C++中的“代码类型> INT/COME > C++中的返回类型,您应该始终使用智能指针(例如:STD::UnQuyjpTR,STD::SyrdyPtR,…)而不是手动分配内存。读这个,然后读C++,然后C++ 11标准,然后你的C++编译器(例如……)和你的调试器(例如……)LHLaurini的文档。我当然同意。但也需要大量的实践。我的问题是“新雇员(艾哈迈德),Ali”)。"为Employee类的实例分配内存并进行初始化。这意味着该对象已经在这里创建并初始化。那么,这里的构造函数需要什么来初始化一个对象和一个字符串动态内存呢?@RizwanMuzaffar main中的每个
new
创建Employee
类的实例。构造函数中的每个new
都会创建一个字符数组。因此,您将得到Employee
类的两个实例(*e1Ptr
和*e2Ptr
)和四个字符数组(e1Ptr->firstName
,e1Ptr->lastName
,e2Ptr->firstName
)但是,对于你的代码,请不要直接分配内存。除非你有理由这样做。我绝对建议你找到一本C++ C++的教程或教程。记住,C和C++是不同的语言:避免任何标记为“C/C++”的东西。。此语句需要什么?e1Ptr=0;@RizwanMuzaffar不需要太多,但它可以避免意外地取消引用刚刚释放的指针(如果指针为空,则更容易调试崩溃)。此外,虽然它仍然有效,但最好使用nullptr
来实现这一点。同样,如果使用std::unique\u ptr
,您也不必关心它。
#include<iostream>
#include<cstring>
using namespace std;
class Employee
{
private:
char *firstName;
char *lastName;
static int count;
public:
Employee( const char * const first, const char * const last){
firstName = new char[ strlen( first ) + 1 ];
strcpy( firstName, first );
lastName = new char[ strlen( last ) + 1 ];
strcpy( lastName, last );
count++;
cout << "Employee constructor for " << firstName
<< ' ' << lastName << " called." << endl;
}
~Employee(){
cout << "~Employee() called for " << firstName
<< ' ' << lastName << endl;
delete [] firstName; // release memory
delete [] lastName; // release memory
count--;
}
const char *getFirstName() const{
return firstName;
}
const char *getLastName() const{
return lastName;
}
static int getCount(){
return count;
}
}; // end class Employee
int Employee::count = 0;
main(){
cout<<"Count = "<<Employee::getCount()<<endl;
Employee *e1Ptr = new Employee( "Ahmad", "Ali" );
Employee *e2Ptr = new Employee( "Saeed", "Khalid" );
cout<<"Count = "<<e1Ptr->getCount()<<endl;
cout << "\n\nEmployee 1: "
<< e1Ptr->getFirstName()<<" "<<e1Ptr->getLastName()
<< "\nEmployee 2: "
<< e2Ptr->getFirstName()<<" "<<e2Ptr->getLastName()<<"\n";
delete e1Ptr;
e1Ptr = 0;
delete e2Ptr;
e2Ptr = 0;
cout<<"Count = "<<Employee::getCount()<<endl;
system("pause");
}